/************************************************************************
*
* Copyright (c) 2014-2025 Barbara Geller & Ansel Sermersheim
* Copyright (c) 1997-2014 Dimitri van Heesch
*
* DoxyPress is free software. You can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* DoxyPress is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Documents produced by DoxyPress are derivative works derived from the
* input used in their production; they are not affected by this license.
*
* https://www.gnu.org/licenses/
*
*************************************************************************/

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define yy_create_buffer preYY_create_buffer
#define yy_delete_buffer preYY_delete_buffer
#define yy_scan_buffer preYY_scan_buffer
#define yy_scan_string preYY_scan_string
#define yy_scan_bytes preYY_scan_bytes
#define yy_init_buffer preYY_init_buffer
#define yy_flush_buffer preYY_flush_buffer
#define yy_load_buffer_state preYY_load_buffer_state
#define yy_switch_to_buffer preYY_switch_to_buffer
#define yypush_buffer_state preYYpush_buffer_state
#define yypop_buffer_state preYYpop_buffer_state
#define yyensure_buffer_stack preYYensure_buffer_stack
#define yy_flex_debug preYY_flex_debug
#define yyin preYYin
#define yyleng preYYleng
#define yylex preYYlex
#define yylineno preYYlineno
#define yyout preYYout
#define yyrestart preYYrestart
#define yytext preYYtext
#define yywrap preYYwrap
#define yyalloc preYYalloc
#define yyrealloc preYYrealloc
#define yyfree preYYfree

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

#ifdef yy_create_buffer
#define preYY_create_buffer_ALREADY_DEFINED
#else
#define yy_create_buffer preYY_create_buffer
#endif

#ifdef yy_delete_buffer
#define preYY_delete_buffer_ALREADY_DEFINED
#else
#define yy_delete_buffer preYY_delete_buffer
#endif

#ifdef yy_scan_buffer
#define preYY_scan_buffer_ALREADY_DEFINED
#else
#define yy_scan_buffer preYY_scan_buffer
#endif

#ifdef yy_scan_string
#define preYY_scan_string_ALREADY_DEFINED
#else
#define yy_scan_string preYY_scan_string
#endif

#ifdef yy_scan_bytes
#define preYY_scan_bytes_ALREADY_DEFINED
#else
#define yy_scan_bytes preYY_scan_bytes
#endif

#ifdef yy_init_buffer
#define preYY_init_buffer_ALREADY_DEFINED
#else
#define yy_init_buffer preYY_init_buffer
#endif

#ifdef yy_flush_buffer
#define preYY_flush_buffer_ALREADY_DEFINED
#else
#define yy_flush_buffer preYY_flush_buffer
#endif

#ifdef yy_load_buffer_state
#define preYY_load_buffer_state_ALREADY_DEFINED
#else
#define yy_load_buffer_state preYY_load_buffer_state
#endif

#ifdef yy_switch_to_buffer
#define preYY_switch_to_buffer_ALREADY_DEFINED
#else
#define yy_switch_to_buffer preYY_switch_to_buffer
#endif

#ifdef yypush_buffer_state
#define preYYpush_buffer_state_ALREADY_DEFINED
#else
#define yypush_buffer_state preYYpush_buffer_state
#endif

#ifdef yypop_buffer_state
#define preYYpop_buffer_state_ALREADY_DEFINED
#else
#define yypop_buffer_state preYYpop_buffer_state
#endif

#ifdef yyensure_buffer_stack
#define preYYensure_buffer_stack_ALREADY_DEFINED
#else
#define yyensure_buffer_stack preYYensure_buffer_stack
#endif

#ifdef yylex
#define preYYlex_ALREADY_DEFINED
#else
#define yylex preYYlex
#endif

#ifdef yyrestart
#define preYYrestart_ALREADY_DEFINED
#else
#define yyrestart preYYrestart
#endif

#ifdef yylex_init
#define preYYlex_init_ALREADY_DEFINED
#else
#define yylex_init preYYlex_init
#endif

#ifdef yylex_init_extra
#define preYYlex_init_extra_ALREADY_DEFINED
#else
#define yylex_init_extra preYYlex_init_extra
#endif

#ifdef yylex_destroy
#define preYYlex_destroy_ALREADY_DEFINED
#else
#define yylex_destroy preYYlex_destroy
#endif

#ifdef yyget_debug
#define preYYget_debug_ALREADY_DEFINED
#else
#define yyget_debug preYYget_debug
#endif

#ifdef yyset_debug
#define preYYset_debug_ALREADY_DEFINED
#else
#define yyset_debug preYYset_debug
#endif

#ifdef yyget_extra
#define preYYget_extra_ALREADY_DEFINED
#else
#define yyget_extra preYYget_extra
#endif

#ifdef yyset_extra
#define preYYset_extra_ALREADY_DEFINED
#else
#define yyset_extra preYYset_extra
#endif

#ifdef yyget_in
#define preYYget_in_ALREADY_DEFINED
#else
#define yyget_in preYYget_in
#endif

#ifdef yyset_in
#define preYYset_in_ALREADY_DEFINED
#else
#define yyset_in preYYset_in
#endif

#ifdef yyget_out
#define preYYget_out_ALREADY_DEFINED
#else
#define yyget_out preYYget_out
#endif

#ifdef yyset_out
#define preYYset_out_ALREADY_DEFINED
#else
#define yyset_out preYYset_out
#endif

#ifdef yyget_leng
#define preYYget_leng_ALREADY_DEFINED
#else
#define yyget_leng preYYget_leng
#endif

#ifdef yyget_text
#define preYYget_text_ALREADY_DEFINED
#else
#define yyget_text preYYget_text
#endif

#ifdef yyget_lineno
#define preYYget_lineno_ALREADY_DEFINED
#else
#define yyget_lineno preYYget_lineno
#endif

#ifdef yyset_lineno
#define preYYset_lineno_ALREADY_DEFINED
#else
#define yyset_lineno preYYset_lineno
#endif

#ifdef yywrap
#define preYYwrap_ALREADY_DEFINED
#else
#define yywrap preYYwrap
#endif

#ifdef yyalloc
#define preYYalloc_ALREADY_DEFINED
#else
#define yyalloc preYYalloc
#endif

#ifdef yyrealloc
#define preYYrealloc_ALREADY_DEFINED
#else
#define yyrealloc preYYrealloc
#endif

#ifdef yyfree
#define preYYfree_ALREADY_DEFINED
#else
#define yyfree preYYfree
#endif

#ifdef yytext
#define preYYtext_ALREADY_DEFINED
#else
#define yytext preYYtext
#endif

#ifdef yyleng
#define preYYleng_ALREADY_DEFINED
#else
#define yyleng preYYleng
#endif

#ifdef yyin
#define preYYin_ALREADY_DEFINED
#else
#define yyin preYYin
#endif

#ifdef yyout
#define preYYout_ALREADY_DEFINED
#else
#define yyout preYYout
#endif

#ifdef yy_flex_debug
#define preYY_flex_debug_ALREADY_DEFINED
#else
#define yy_flex_debug preYY_flex_debug
#endif

#ifdef yylineno
#define preYYlineno_ALREADY_DEFINED
#else
#define yylineno preYYlineno
#endif

/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L

/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
 * if you want the limit (max/min) macros for int types. 
 */
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif

#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t; 
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

#ifndef SIZE_MAX
#define SIZE_MAX               (~(size_t)0)
#endif

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

/* begin standard C++ headers. */

/* TODO: this is always defined, so inline it */
#define yyconst const

#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif

/* Returned upon end-of-file. */
#define YY_NULL 0

/* Promotes a possibly negative, possibly signed char to an
 *   integer in range [0..255] for use as an array index.
 */
#define YY_SC_TO_UI(c) ((YY_CHAR) (c))

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN (yy_start) = 1 + 2 *
/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START (((yy_start) - 1) / 2)
#define YYSTATE YY_START
/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE yyrestart( yyin  )
#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
 * Ditto for the __ia64__ case accordingly.
 */
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 262144
#endif /* __ia64__ */
#endif

/* The state buf must be large enough to hold one state per character in the main buffer.
 */
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))

#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif

extern int yyleng;

extern FILE *yyin, *yyout;

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
    
    #define YY_LESS_LINENO(n)
    #define YY_LINENO_REWIND_TO(ptr)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		*yy_cp = (yy_hold_char); \
		YY_RESTORE_YY_MORE_OFFSET \
		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )
#define unput(c) yyunput( c, (yytext_ptr)  )

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
	{
	FILE *yy_input_file;

	char *yy_ch_buf;		/* input buffer */
	char *yy_buf_pos;		/* current position in input buffer */

	/* Size of input buffer in bytes, not including room for EOB
	 * characters.
	 */
	int yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	int yy_n_chars;

	/* Whether we "own" the buffer - i.e., we know we created it,
	 * and can realloc() it to grow it, and should free() it to
	 * delete it.
	 */
	int yy_is_our_buffer;

	/* Whether this is an "interactive" input source; if so, and
	 * if we're using stdio for input, then we want to use getc()
	 * instead of fread(), to make sure we stop fetching input after
	 * each newline.
	 */
	int yy_is_interactive;

	/* Whether we're considered to be at the beginning of a line.
	 * If so, '^' rules will be active on the next match, otherwise
	 * not.
	 */
	int yy_at_bol;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */

	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via yyrestart()), so that the user can continue scanning by
	 * just pointing yyin at a new input file.
	 */
#define YY_BUFFER_EOF_PENDING 2

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* Stack of input buffers. */
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
static YY_BUFFER_STATE * yy_buffer_stack = nullptr; /**< Stack as an array. */

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 *
 * Returns the top of the stack, or nullptr.
 */
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
                          : nullptr)
/* Same as previous macro, but useful when we know that the buffer stack is not
 * nullptr or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]

/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;
static int yy_n_chars;		/* number of characters read into yy_ch_buf */
int yyleng;

/* Points to current character in buffer. */
static char *yy_c_buf_p = nullptr;
static int yy_init = 0;		/* whether we need to initialize */
static int yy_start = 0;	/* start state number */

/* Flag which is used to allow yywrap()'s to do buffer switches
 * instead of setting up a fresh yyin.  A bit of a hack ...
 */
static int yy_did_buffer_switch_on_eof;

void yyrestart ( FILE *input_file  );
void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
void yy_delete_buffer ( YY_BUFFER_STATE b  );
void yy_flush_buffer ( YY_BUFFER_STATE b  );
void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
void yypop_buffer_state ( void );

static void yyensure_buffer_stack ( void );
static void yy_load_buffer_state ( void );
static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )

YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );

void *yyalloc ( yy_size_t  );
void *yyrealloc ( void *, yy_size_t  );
void yyfree ( void *  );

#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}
#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define preYYwrap() (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
typedef flex_uint8_t YY_CHAR;

FILE *yyin = nullptr, *yyout = nullptr;

typedef int yy_state_type;

extern int yylineno;
int yylineno = 1;

extern char *yytext;
#ifdef yytext_ptr
#undef yytext_ptr
#endif
#define yytext_ptr yytext

static yy_state_type yy_get_previous_state ( void );
static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
static int yy_get_next_buffer ( void );
static void yynoreturn yy_fatal_error ( const char* msg  );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	(yytext_ptr) = yy_bp; \
	yyleng = (int) (yy_cp - yy_bp); \
	(yy_hold_char) = *yy_cp; \
	*yy_cp = '\0'; \
	(yy_c_buf_p) = yy_cp;
#define YY_NUM_RULES 217
#define YY_END_OF_BUFFER 218
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static const flex_int16_t yy_acclist[1890] =
    {   0,
      198,  198,  218,  216,  217,    1,  216,  217,  214,  217,
        3,  216,  217,  216,  217,  216,  217,  216,  217,    2,
      216,  217,    6,  216,  217,    1,    6,  216,  217,    6,
      216,  217,    6,  214,  217,    3,    6,  216,  217,    5,
      216,  217,    6,  216,  217,    6,  216,  217,    6,  216,
      217,    6,  216,  217,    6,  216,  217,    2,    6,  216,
      217,   76,  216,  217,    1,   76,  216,  217,   71,  214,
      217,    3,   76,  216,  217,   76,  216,  217,   76,  216,
      217,   73,   76,  216,  217,   73,   76,  216,  217,   73,
       76,  216,  217,   73,   76,  216,  217,   73,   76,  216,

      217,   73,   76,  216,  217,   73,   76,  216,  217,   73,
       76,  216,  217,    2,   76,  216,  217,  111,  216,  217,
        1,  111,  216,  217,  109,  214,  217,    3,  111,  216,
      217,  111,  216,  217,  111,  216,  217,  110,  111,  216,
      217,  110,  111,  216,  217,  110,  111,  216,  217,  110,
      111,  216,  217,    2,  111,  216,  217,  112,  115,  216,
      217,    1,  112,  115,  216,  217,  120,  214,  217,    3,
      112,  115,  216,  217,  114,  115,  216,  217,  115,  216,
      217,  115,  216,  217,  112,  115,  216,  217,  112,  115,
      216,  217,    2,  112,  115,  216,  217,  121,  124,  216,

      217,    1,  121,  124,  216,  217,    3,  121,  124,  216,
      217,  123,  124,  216,  217,  121,  124,  216,  217,  121,
      124,  216,  217,  124,  216,  217,  121,  124,  216,  217,
        2,  121,  124,  216,  217,   37,  216,  217,    1,   37,
      216,  217,   38,  214,  217,    3,   37,  216,  217,   18,
       37,  216,  217,   19,   37,  216,  217,   37,  216,  217,
       37,  216,  217,   37,  216,  217,   34,   37,  216,  217,
    16417,   34,   37,  216,  217,16417,   34,   37,  216,  217,
    16417,   34,   37,  216,  217,16417,   34,   37,  216,  217,
    16417,   37,  216,  217,   12,   37,  216,  217,   13,   37,

      216,  217,   34,   37,  216,  217,16417,    2,   37,  216,
      217,   20,  216,  217,    1,   20,  216,  217,   23,  216,
      217,   20,  216,  217,   20,  216,  217,  216,  217,   20,
      216,  217,    2,   20,  216,  217,   21,  216,  217,    1,
       21,  216,  217,   21,  216,  217,   21,  216,  217,   21,
      216,  217,    2,   21,  216,  217,   27,  216,  217,    1,
       27,  216,  217,   29,  216,  217,   27,  216,  217,   27,
      216,  217,  216,  217,   27,  216,  217,    2,   27,  216,
      217,   24,  216,  217,    1,   24,  216,  217,   26,  216,
      217,   24,  216,  217,   24,  216,  217,  216,  217,   24,

      216,  217,    2,   24,  216,  217,   31,   32,  216,  217,
        1,   31,   32,  216,  217,   31,  214,  217,    3,   31,
       32,  216,  217,   32,  216,  217,   31,   32,  216,  217,
       31,   32,  216,  217,   31,   32,  216,  217,    2,   31,
       32,  216,  217,  216,  217,    1,  216,  217,    3,  216,
      217,  216,  217,  216,  217,  216,  217,    2,  216,  217,
      126,  216,  217,  126,  216,  217,  130,  216,  217,    1,
      130,  216,  217,  128,  214,  217,    3,  130,  216,  217,
      130,  216,  217,  130,  216,  217,  130,  216,  217,  130,
      216,  217,    2,  130,  216,  217, 8326,  216,  217,16515,

    16517,16518, 8326,  216,  217,16515,16517,16518,  216,  217,
      137,  216,  217,  138,  216,  217,  136,  216,  217,  216,
      217,  140,  216,  217,  216,  217,  140,  216,  217,  210,
      216,  217,    1,  210,  216,  217,  198,  210,  216,  217,
      197,  214,  217,    3,  210,  216,  217,  201,  210,  216,
      217,  210,  216,  217,  202,  210,  216,  217,  210,  216,
      217,  210,  216,  217,  200,  210,  216,  217,  194,  210,
      216,  217,  210,  216,  217,  194,  210,  216,  217,    2,
      210,  216,  217,  104,  216,  217,    1,  104,  216,  217,
      103,  214,  217,    3,  104,  216,  217,  104,  216,  217,

      104,  216,  217,  104,  216,  217,    2,  104,  216,  217,
      102,  104,  216,  217,    1,  102,  104,  216,  217,  102,
      104,  216,  217,  102,  103,  214,  217,    3,  102,  104,
      216,  217,  101,  104,  216,  217,  102,  104,  216,  217,
      102,  104,  216,  217,  102,  104,  216,  217,    2,  102,
      104,  216,  217,  169,  171,  216,  217,    1,  171,  216,
      217,  170,  214,  217,    3,  169,  171,  216,  217,  171,
      216,  217,  171,  216,  217,  169,  171,  216,  217,  171,
      216,  217,  171,  216,  217,  169,  171,  216,  217,    2,
      169,  171,  216,  217,  169,  171,  216,  217,  171,  216,

      217,  171,  216,  217,  171,  216,  217,   48,   51,  216,
      217,    1,   48,   51,  216,  217,   50,  214,  217,    3,
       48,   51,  216,  217,   51,  216,  217,   48,   51,  216,
      217,   48,   51,  216,  217,   48,   51,  216,  217,    2,
       48,   51,  216,  217,  172,  195,  216,  217,    1,  172,
      195,  216,  217,  175,  214,  217,    3,  172,  195,  216,
      217,  195,  216,  217,  172,  195,  216,  217,  172,  195,
      216,  217,  194,  195,  216,  217,  195,  216,  217,  194,
      195,  216,  217,    2,  172,  195,  216,  217,  171,  216,
      217,  171,  216,  217,  171,  216,  217,  169,  171,  216,

      217,  171,  216,  217,  171,  216,  217,  171,  216,  217,
      183,  187,  188,  216,  217,    1,  183,  188,  216,  217,
      184,  214,  217,    3,  183,  187,  188,  216,  217,  187,
      188,  216,  217,  183,  187,  188,  216,  217,  188,  216,
      217,  183,  187,  188,  216,  217,    2,  183,  187,  188,
      216,  217,  180,  182,  216,  217,    1,  182,  216,  217,
      181,  214,  217,    3,  180,  182,  216,  217,  182,  216,
      217,  180,  182,  216,  217,  180,  182,  216,  217,  180,
      182,  216,  217,    2,  180,  182,  216,  217,  191,  192,
      216,  217,    1,  192,  216,  217,    3,  191,  192,  216,

      217,  191,  192,  216,  217,  191,  192,  216,  217,  191,
      192,  216,  217,    2,  191,  192,  216,  217,   93,  216,
      217,    1,   93,  216,  217,   94,  214,  217,    3,   93,
      216,  217,   93,  216,  217,   93,  216,  217,   92,   93,
      216,  217,   91,   93,  216,  217,   91,   93,  216,  217,
       91,   93,  216,  217,   91,   93,  216,  217,   91,   93,
      216,  217,   91,   93,  216,  217,   91,   93,  216,  217,
       91,   93,  216,  217,   91,   93,  216,  217,   91,   93,
      216,  217,   93,  216,  217,   91,   93,  216,  217,    2,
       93,  216,  217,  100,  216,  217,    1,  100,  216,  217,

       98,  214,  217,    3,  100,  216,  217,  100,  216,  217,
      100,  216,  217,   96,  100,  216,  217,  100,  216,  217,
       96,  100,  216,  217,    2,  100,  216,  217,   99,  100,
      216,  217,   97,  100,  216,  217,   97,  100,  216,  217,
      208,  216,  217,    1,  208,  216,  217,    3,  208,  216,
      217,  205,  208,  216,  217,  208,  216,  217,  208,  216,
      217,  208,  216,  217,  208,  216,  217,    2,  208,  216,
      217,  209,  216,  217,    1,  209,  216,  217,    3,  209,
      216,  217,  207,  209,  216,  217,  209,  216,  217,  209,
      216,  217,  209,  216,  217,  209,  216,  217,    2,  209,

      216,  217,   77,  216,  217,   77,  216,  217,   75,  216,
      217,    1,   75,  216,  217,    3,   75,  216,  217,   75,
      216,  217,   75,  216,  217,   75,  216,  217,   75,  216,
      217,    2,   75,  216,  217,   47,  216,  217,    1,   47,
      216,  217,   45,  214,  217,    3,   47,  216,  217,   43,
       47,  216,  217,   44,   47,  216,  217,   39,   47,  216,
      217,   40,   47,  216,  217,   47,  216,  217,   47,  216,
      217,   46,   47,  216,  217,   47,  216,  217,    2,   47,
      216,  217,   57,  216,  217,    1,   57,  216,  217,    3,
       57,  216,  217,   52,   57,  216,  217,   53,   57,  216,

      217,   57,  216,  217,   57,  216,  217,   57,  216,  217,
       57,  216,  217,    2,   57,  216,  217,  155,  216,  217,
        1,  155,  216,  217,  154,  155,  216,  217,    3,  155,
      216,  217,  155,  216,  217,  155,  216,  217,  154,  155,
      216,  217,    2,  155,  216,  217,  158,  159,  216,  217,
        1,  158,  159,  216,  217,  157,  214,  217,    3,  158,
      159,  216,  217,  158,  216,  217,  158,  216,  217,  158,
      159,  216,  217,  158,  216,  217,  158,  159,  216,  217,
        2,  158,  159,  216,  217,  212,  213,  215,    6,    6,
        5,    6,    6,  215,   73,   73,   73,   73,   73,   73,

       73,   73,   73,   73,   73,  215,  119,  212,  117,  213,
      110,  110,  110,  110,  110,  215,  112,  112,  112,  215,
      121,  118,  121,  212,  116,  121,  213,  121,  122,  121,
      215,   17, 8225,   34,16417,   34,16417,   34,16417,   34,
    16417,   36,   35,   36,   34,  215,16417,   20,   20,  212,
       20,  213,   20,   22,   20,  215,   21,   21,  212,   21,
      213,   21,   21,  215,   27,   27,  212,   27,  213,   27,
       28,   27,  215,   24,   24,  212,   24,  213,   24,   25,
       24,  215,   31,   30,   31,  212,   31,  213,   31,   31,
      215,  127,  212,  213,  215,  125,  126,  126,  215,  128,

      212,  213,  129,  215, 8326, 8325, 8323, 8326,16515,16517,
    16518, 8326,  215,16515,16517,16518,  138,  137,  138,  136,
      140,  140,  135,  140,  215,  198,  199,  193,  141,  212,
      142,  213,  194,  196,  194,  215,  102,  102,  101,  169,
      143,  145,  212,  144,  213,  169,  169,  215,  169,   48,
       49,   48,  213,   48,   48,  215,  172,  174,  172,  213,
      172,  173,  172,  168,  168,  212,  169,  183,  187,  183,
      187,  185,  187,  212,  186,  187,  213,  183,  187,  183,
      187,  215,  180,  177,  179,  212,  178,  180,  213,  180,
      180,  215,  191,  189,  191,  212,  190,  191,  213,  191,

      191,  215,   91,   91,   91,   91,   91,   91,   91,   91,
       91,   91,   78,   91,  215,   96,   95,   96,  215,   97,
       97,  215,  204,  212,  203,  213,  206,   77,   77,  215,
       74,   42,  212,   54,  212,   54,  213,   56,   55,   56,
      154,  154,  215,  159,  212,  213,  159,  159,  215,  212,
      213,    4,   73,   73,   73,   73,   73,   65,   73,   73,
       73,   73,   73,   73,  119,  119,  212,  117,  117,  213,
      110,  110,  110,  105,  110,  110,  113,    4,  112,  118,
      121,  118,  118,  121,  212,  116,  121,  116,  116,  121,
      213,    4,  121,   16,   16,   34,16417,   11,   20,  212,

       20,  213,    4,   20,   21,  212,   21,  213,    4,   21,
       27,  212,   27,  213,    4,   27,   24,  212,   24,  213,
        4,   24,   30,   31,  212,   31,  213,    4,   31,  212,
      213,    4,    4,  127,  212,  213,    4,  139,  199,  141,
      141,  212,  142,  142,  213,  144,  213,    4,  169,  169,
      148,  147,   48,  213,    4,   48,  172,  213,    4,  172,
      165,  169,  167,  166,  187,  212,  187,  213,    4,  183,
      187,    4,  187,  176,  180,  213,    4,  180,  191,  212,
      191,  213,    4,  191,   91,   91,   91,   91,   91,   91,
       86,   91,   91,  204,  212,  203,  213,   41,   42,  212,

      161,  161,  212,  160,  160,  213,    4,  159,  211,16391,
    16391,   73,   73,   73,   73,   73,   73,   73,   73,   73,
       73,   73,  119,  211,  110,  106,  110,  110,  110,  113,
      118,  121,  211,   15,   14,   15,   34,16417,   20,  211,
       21,  211,   27,  211,   24,  211,   30,   31,  211,  211,
      211,  132,  140,  144,  146,  169,  148,  147,  169,  167,
      166,  187,  211,  191,  211,   85,   91,   91,   91,   91,
       91,   83,   91,   91,   89,   41,16391,    9, 8199,   73,
       73,   66,   69,   67,   67,   73,   73,   73,   73,   73,
       73,   73,   73,  107,  110,  108,  110,  110,   14,   34,

    16417,   30,  150,   91,   91,   91,   91,   91,   91,   81,
       81, 8199,    9,   73,   73,   73,   70,   62,   61,   73,
       73,   73,   73,   68,  110,   34,16417,   30,  149,  153,
      156,  152,   91,   88,   90,   91,   82,   82,   91,    8,
        9,   60,   64,   63,16442,   59,   73,   30,  151,  165,
       87,   91,   84,    9, 8250,   30,  165,   80,   79,    9,
     8250,   10,   30,  164,  163,    9,   10,   10,   30,  162,
        9,   72,   30,  165,  165,  165,    9,   30,  165,    9,
       30,  165,    9,   30,   30,  165,   30,   30,   30
    } ;

static const flex_int16_t yy_accept[1445] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    2,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    4,    6,    9,   11,   14,   16,   18,   20,   23,
       26,   30,   33,   36,   40,   43,   46,   49,   52,   55,

       58,   62,   65,   69,   72,   76,   79,   82,   86,   90,
       94,   98,  102,  106,  110,  114,  118,  121,  125,  128,
      132,  135,  138,  142,  146,  150,  154,  158,  162,  167,
      170,  175,  179,  182,  185,  189,  193,  198,  202,  207,
      212,  216,  220,  224,  227,  231,  236,  239,  243,  246,
      250,  254,  258,  261,  264,  267,  272,  277,  282,  287,
      292,  295,  299,  303,  308,  312,  315,  319,  322,  325,
      328,  330,  333,  337,  340,  344,  347,  350,  353,  357,
      360,  364,  367,  370,  373,  375,  378,  382,  385,  389,
      392,  395,  398,  400,  403,  407,  411,  416,  419,  424,

      427,  431,  435,  439,  444,  446,  449,  452,  454,  456,
      458,  461,  464,  467,  470,  474,  477,  481,  484,  487,
      490,  493,  497,  503,  509,  511,  514,  517,  520,  522,
      525,  527,  530,  533,  537,  541,  544,  548,  552,  555,
      559,  562,  565,  569,  573,  576,  580,  584,  587,  591,
      594,  598,  601,  604,  607,  611,  615,  620,  624,  628,
      633,  637,  641,  645,  649,  654,  658,  662,  665,  670,
      673,  676,  680,  683,  686,  690,  695,  699,  702,  705,
      708,  712,  717,  720,  725,  728,  732,  736,  740,  745,
      749,  754,  757,  762,  765,  769,  773,  777,  780,  784,

      789,  792,  795,  798,  802,  805,  808,  811,  816,  821,
      824,  830,  834,  839,  842,  847,  853,  857,  861,  864,
      869,  872,  876,  880,  884,  889,  893,  897,  902,  906,
      910,  914,  919,  922,  926,  929,  933,  936,  939,  943,
      947,  951,  955,  959,  963,  967,  971,  975,  979,  983,
      986,  990,  994,  997, 1001, 1004, 1008, 1011, 1014, 1018,
     1021, 1025, 1029, 1033, 1037, 1041, 1044, 1048, 1052, 1056,
     1059, 1062, 1065, 1068, 1072, 1075, 1079, 1083, 1087, 1090,
     1093, 1096, 1099, 1103, 1106, 1109, 1112, 1116, 1120, 1123,
     1126, 1129, 1132, 1136, 1139, 1143, 1146, 1150, 1154, 1158,

     1162, 1166, 1169, 1172, 1176, 1179, 1183, 1186, 1190, 1194,
     1198, 1202, 1205, 1208, 1211, 1214, 1218, 1221, 1225, 1229,
     1233, 1236, 1239, 1243, 1247, 1251, 1256, 1259, 1264, 1267,
     1270, 1274, 1277, 1281, 1286, 1287, 1288, 1288, 1289, 1290,
     1291, 1292, 1293, 1294, 1294, 1294, 1295, 1296, 1297, 1298,
     1299, 1300, 1301, 1302, 1303, 1304, 1305, 1307, 1309, 1311,
     1312, 1313, 1314, 1315, 1317, 1318, 1318, 1318, 1319, 1321,
     1322, 1325, 1328, 1329, 1330, 1332, 1332, 1332, 1333, 1333,
     1334, 1336, 1338, 1340, 1340, 1342, 1343, 1344, 1345, 1348,
     1349, 1351, 1353, 1354, 1355, 1357, 1358, 1360, 1362, 1363,

     1365, 1366, 1368, 1370, 1371, 1372, 1374, 1375, 1377, 1379,
     1380, 1381, 1383, 1384, 1384, 1385, 1387, 1389, 1390, 1392,
     1392, 1393, 1394, 1395, 1395, 1396, 1396, 1397, 1398, 1400,
     1400, 1401, 1402, 1403, 1403, 1404, 1404, 1405, 1406, 1407,
     1408, 1412, 1412, 1417, 1417, 1418, 1419, 1420, 1421, 1421,
     1422, 1422, 1423, 1424, 1426, 1427, 1427, 1428, 1429, 1431,
     1433, 1434, 1435, 1435, 1437, 1438, 1439, 1440, 1441, 1442,
     1444, 1446, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
     1447, 1447, 1447, 1449, 1450, 1450, 1450, 1450, 1450, 1450,
     1450, 1451, 1452, 1454, 1455, 1457, 1458, 1458, 1459, 1461,

     1462, 1463, 1464, 1465, 1467, 1467, 1467, 1468, 1468, 1468,
     1468, 1468, 1468, 1468, 1470, 1471, 1472, 1475, 1478, 1480,
     1480, 1480, 1483, 1484, 1485, 1487, 1490, 1491, 1493, 1494,
     1497, 1500, 1501, 1503, 1504, 1505, 1506, 1507, 1508, 1509,
     1510, 1511, 1512, 1513, 1514, 1514, 1516, 1517, 1518, 1520,
     1521, 1523, 1525, 1527, 1528, 1529, 1531, 1532, 1532, 1532,
     1532, 1534, 1536, 1538, 1539, 1540, 1541, 1542, 1544, 1545,
     1546, 1547, 1548, 1548, 1548, 1550, 1551, 1552, 1553, 1553,
     1553, 1553, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560,
     1561, 1562, 1563, 1564, 1565, 1566, 1568, 1569, 1571, 1572,

     1573, 1574, 1575, 1576, 1577, 1577, 1578, 1578, 1578, 1580,
     1582, 1583, 1586, 1588, 1589, 1592, 1594, 1595, 1595, 1596,
     1596, 1596, 1598, 1598, 1599, 1601, 1603, 1605, 1607, 1609,
     1611, 1613, 1615, 1617, 1619, 1621, 1623, 1623, 1624, 1626,
     1628, 1630, 1631, 1632, 1633, 1635, 1636, 1637, 1638, 1638,
     1638, 1639, 1639, 1640, 1641, 1643, 1644, 1646, 1648, 1650,
     1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650,
     1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1651,
     1651, 1652, 1653, 1655, 1657, 1659, 1661, 1661, 1662, 1662,
     1663, 1663, 1664, 1665, 1667, 1669, 1672, 1674, 1674, 1674,

     1674, 1675, 1677, 1679, 1681, 1683, 1685, 1686, 1687, 1688,
     1689, 1690, 1691, 1692, 1693, 1694, 1696, 1698, 1698, 1699,
     1699, 1699, 1701, 1702, 1704, 1705, 1707, 1709, 1709, 1710,
     1710, 1710, 1711, 1711, 1712, 1713, 1714, 1715, 1716, 1717,
     1718, 1719, 1720, 1721, 1722, 1723, 1725, 1726, 1728, 1729,
     1730, 1730, 1731, 1731, 1734, 1735, 1737, 1737, 1737, 1739,
     1739, 1741, 1743, 1745, 1747, 1747, 1748, 1750, 1751, 1752,
     1753, 1754, 1755, 1755, 1755, 1755, 1756, 1756, 1756, 1756,
     1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756,
     1756, 1756, 1756, 1756, 1756, 1757, 1757, 1758, 1759, 1759,

     1759, 1760, 1760, 1761, 1762, 1764, 1764, 1764, 1766, 1767,
     1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1776,
     1777, 1777, 1777, 1777, 1778, 1778, 1779, 1779, 1780, 1781,
     1782, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792,
     1793, 1794, 1795, 1795, 1796, 1798, 1799, 1799, 1799, 1800,
     1800, 1800, 1802, 1802, 1802, 1803, 1803, 1803, 1803, 1803,
     1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803, 1803,
     1803, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804,
     1804, 1804, 1804, 1804, 1804, 1804, 1804, 1804, 1805, 1806,
     1807, 1808, 1809, 1810, 1811, 1812, 1812, 1812, 1812, 1812,

     1812, 1812, 1812, 1812, 1813, 1813, 1814, 1814, 1815, 1816,
     1816, 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824,
     1825, 1825, 1826, 1826, 1828, 1828, 1828, 1829, 1829, 1829,
     1829, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830,
     1831, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
     1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1833,
     1834, 1835, 1836, 1837, 1838, 1839, 1839, 1840, 1840, 1840,
     1840, 1840, 1840, 1841, 1841, 1842, 1842, 1843, 1843, 1844,
     1845, 1846, 1847, 1848, 1848, 1848, 1848, 1848, 1848, 1848,
     1848, 1849, 1849, 1850, 1850, 1850, 1850, 1850, 1850, 1850,

     1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850,
     1850, 1850, 1850, 1850, 1851, 1851, 1851, 1851, 1851, 1851,
     1851, 1852, 1853, 1853, 1854, 1854, 1854, 1854, 1854, 1855,
     1855, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1857, 1857,
     1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857,
     1857, 1857, 1857, 1857, 1857, 1857, 1857, 1858, 1858, 1858,
     1858, 1858, 1858, 1858, 1858, 1859, 1860, 1860, 1860, 1860,
     1860, 1861, 1861, 1862, 1862, 1862, 1862, 1863, 1863, 1863,
     1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864,
     1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865,

     1865, 1866, 1866, 1866, 1866, 1867, 1867, 1867, 1867, 1867,
     1868, 1869, 1869, 1869, 1870, 1870, 1871, 1871, 1871, 1871,
     1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871,
     1871, 1871, 1872, 1872, 1873, 1873, 1873, 1873, 1873, 1874,
     1874, 1874, 1874, 1874, 1874, 1874, 1875, 1876, 1876, 1877,
     1877, 1877, 1877, 1878, 1878, 1878, 1878, 1878, 1878, 1879,
     1879, 1879, 1879, 1880, 1880, 1880, 1880, 1880, 1881, 1881,
     1881, 1881, 1881, 1881, 1882, 1882, 1882, 1883, 1883, 1883,
     1883, 1884, 1884, 1884, 1884, 1884, 1884, 1885, 1885, 1885,
     1885, 1885, 1885, 1885, 1885, 1886, 1887, 1887, 1887, 1887,

     1887, 1888, 1888, 1888, 1888, 1888, 1889, 1889, 1889, 1889,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,

     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890,
     1890, 1890, 1890, 1890
    } ;

static const YY_CHAR yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    2,    1,    1,    3,    4,
        1,    1,    5,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    3,    6,    7,    8,    9,    1,   10,   11,   12,
       13,   14,    1,   15,   16,   17,   18,   19,   20,   19,
       19,   19,   19,   19,   19,   21,   22,   23,    1,   24,
       25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
       35,   36,   37,   38,   39,   40,   41,   42,   43,   44,
       45,   46,   47,   48,   49,   50,   38,   51,   52,   38,
       53,   54,   55,    1,   56,   57,   58,   59,   60,   61,

       62,   63,   64,   65,   66,   38,   67,   68,   69,   70,
       71,   72,   73,   74,   75,   76,   77,   78,   38,   79,
       80,   38,   81,   10,   82,   83,    1,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
       84,   85,   85,   85,   85,   85,   85,   85,   85,   85,

       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85
    } ;

static const YY_CHAR yy_meta[87] =
    {   0,
        1,    2,    3,    4,    5,    6,    7,    8,    1,    9,
       10,   11,   12,   13,    1,    9,   14,   15,   16,   16,
       16,   16,    1,   17,    1,    1,    1,   18,   19,   19,
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
       19,   19,    1,   20,    1,   19,   21,   19,   19,   19,
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
       19,   19,   19,   19,   19,   19,   19,   19,   19,   19,
        1,    1,   21,   19,   19,    1
    } ;

static const flex_int16_t yy_base[1648] =
    {   0,
        0,    4,    8,   94,  180,    0,  266,    0,  351,  359,
      369,  377,  463,    0,  548,  552,  556,  560,  586,  590,
      605,  646,  650,  656,  677,  692,  778,    0,  684,  863,
      949,    0, 1035,    0, 1121,    0, 1206, 1210, 1217, 1221,
     1225, 1236, 1251, 1336, 1257, 1262, 1422,    0, 1507, 1592,
     1328, 1513, 1518, 1542, 1547, 1553, 1678,    0, 1764,    0,
     1850,    0, 1582, 1935, 1939, 1943, 2029,    0, 2114, 2118,
     2122, 2149, 2178, 2211, 2297, 2383,    0,    0, 2241, 2256,
     4452, 8470, 8470, 8470, 8470,    1, 4417, 4359, 8470, 8470,
     8470, 2469, 8470, 8470, 8470,    2, 4414,    3,    0, 4355,

     8470, 8470, 8470, 8470, 8470,    3, 4404,    0,    0,    0,
        0,    2,    0,    3, 4346, 8470, 8470, 8470, 8470, 8470,
       10, 4401,    0,    7,    0, 4342, 8470,    0,    0, 8470,
        0, 8470, 4364,   11, 4390, 4331,    0,    0,    0,    0,
     8470,   34, 4386,    0, 4321,    0, 8470, 8470, 8470, 8470,
     8470, 4350,   36, 4375, 4393,   52,  568,  386,  396,  702,
       33, 8470, 8470,  581, 8470,    0,    0, 8470,   62, 4365,
        0, 4307,    0,    0,    0,   64, 4362, 4303,    0,    0,
        0, 8470,   65, 4352,    0, 4294,    0,    0,    0, 8470,
      354, 4349,    0, 4290,    0,    0,    0,    0,    0, 4359,

      374, 4338, 4279,    0,    4,   25,   32,  395,  390,  368,
      386,   11,  565, 4357, 4349, 8470, 4348,  401,   57,   55,
      350, 4346,  612,  624,   78, 4345, 4337, 4336, 4320,   50,
     4331,  586, 8470, 8470,  357, 8470, 8470, 8470, 4319, 8470,
      392, 4299, 8470,    0,  420, 4240, 8470, 8470, 8470, 8470,
     8470,  393, 4295, 4230, 8470, 8470, 8470,  377, 8470, 8470,
     8470,  400, 4286, 4227, 8470,    0, 8470, 8470,    0, 4291,
      408, 4274, 2528, 8470, 4216,    0,  863, 1231, 4241, 4213,
        0,    0, 8470,    0, 4270,  415, 4260, 4201,    0, 4229,
     4221, 8470, 4220, 4254,  608,  393,    0,  577, 4186, 4208,

     4243,  421,  394, 1217, 1233, 4202, 4174,  365,    0, 8470,
      428,  424,  603,  689,  596,  441,    0, 8470, 8470,    0,
     4231,  435, 4221, 4162,    0,    0, 8470,    0,  582, 4217,
     4152,    0, 8470, 8470, 8470, 8470,  611, 4208, 8470,  569,
      619,  644,  659,    0,  669,  658,  663,  666,  673,  436,
     4149, 8470, 8470, 8470, 8470, 8470,  710, 4204,    0, 4219,
     4138, 8470, 8470,    0, 4136, 8470, 8470, 8470, 8470,  712,
     4191,    0, 4126, 8470, 8470, 8470, 8470, 8470,  732, 4182,
        0, 4123, 8470,    0, 4121, 8470, 8470, 8470,  738, 4170,
      446, 4112, 8470, 8470, 8470, 8470, 8470, 8470, 4140, 8470,

     8470,  739, 4165, 8470, 4100, 8470, 8470, 8470, 8470, 8470,
     8470,  740, 4156,  729, 4097, 8470, 8470, 8470,    0, 8470,
      741, 4152, 4087, 8470,    0,    0, 8470,    0, 8470,  746,
     4143,  841, 4084,    0, 4152, 4140,  867, 4073, 8470, 2607,
     8470,  681,    0, 1274,  872, 1269,    0,  710,  711,  835,
      838, 1521,  703,  840,  847,  854, 4071, 4139, 4127,    0,
      850,  857, 1573, 4060,    0, 4131,  752,  915, 4056,    0,
     1243,  889, 1354, 8470, 4048, 4120,  893, 8470,  932, 8470,
     1314, 1525, 1380, 4117, 2166, 8470, 8470, 4123, 2143,    0,
     4105, 4100, 1383, 8470, 4032,    0, 4100, 4088, 1605, 4021,

        0, 4089, 4083, 1629, 8470, 4009,    0, 4078, 4072, 1645,
     8470, 4004,    0, 4073, 4072, 4063, 4057, 1961, 3983,  592,
     8470,  916, 1275, 1988, 1261,  899, 8470,  926, 1332, 4062,
     8470,  444,  639, 2349, 8470, 4060,  689, 1295, 8470, 8470,
     1610, 4058, 2127,  885, 4051, 4050, 4048, 4046, 4024,  891,
     4023, 1229, 8470, 1935,  906, 4030, 4033, 8470,  918,  707,
        0, 8470, 4024, 3943, 8470, 1301, 8470,    0, 8470, 1306,
     4007, 2322, 2663,  863,  876, 1200, 1237, 1254, 1265, 1281,
     1319, 1308, 3939, 1567, 1569, 3958, 3931, 2118, 3955, 3927,
        0, 8470, 3984, 2406, 3917, 3945, 3943, 8470, 1307, 2694,

     8470, 1358, 8470, 3975, 1327, 1318, 2184, 2192, 3931, 3903,
     2134, 3927, 3893, 1373,    0,    0, 3961, 3955, 2433, 1343,
     1467, 1524,    0, 1403, 3957, 3945, 2559, 3878,    0, 3946,
     3940, 2727, 3866,    0, 1354, 1502, 1596, 1354, 1604, 1600,
     3946, 1906, 1910, 8470, 3943, 3861,    0, 8470, 3852,    0,
     3851, 3914, 3908, 8470,    0, 3833, 8470, 3911, 3895, 1197,
     3890, 3885, 3875, 8470, 8470, 3888,    0, 3805,    0, 1396,
     1548, 2743, 1481, 1918, 3794, 3857, 8470, 8470, 1536, 1647,
     1556, 3861, 1924, 1909, 1915, 1918, 1932, 8470, 1943, 1949,
     1921, 1928, 1947, 2095,    0, 3855,    0,    0, 2110, 2126,

     2126, 8470, 2131, 2133, 3861, 8470, 3842, 1996,    0,  613,
        0, 2172, 1344,    0, 1364,    0, 8470, 3838, 3830, 1998,
     2216, 2274, 3828, 8470, 3817,    0,    0, 3793,    0,    0,
     3792,    0,    0, 3787,    0,    0, 3789, 3784, 3765,    0,
        0, 2207, 1581, 1964, 8470, 2004, 3778, 3772, 2247, 2130,
     8470, 3758, 3765, 8470, 3738, 8470, 8470, 3717,    0, 2095,
     2115, 2132, 2200, 2196, 2181, 2208, 2200, 2209, 2213, 2248,
     2269, 2224, 2247, 2243, 2261, 2280, 2284, 2304, 2708, 2140,
     3667, 3621,    0,    0, 3625, 3612, 2305, 8470, 2305, 2713,
     2346, 3593, 3558, 3567,    0, 1402,    0, 2328, 2334, 2228,

     8470,    0,    0, 3542,    0,    0, 3539, 2731, 2356, 2386,
     2366, 2360, 8470, 2353, 3535, 3499, 8470, 3489, 8470, 3465,
     2414, 3452, 8470, 3444, 8470, 8470,    0, 2332, 8470, 1661,
     3448, 2759, 3444, 2772, 2381, 2335, 2444, 2853, 2392, 2523,
     2525, 2374, 2514, 2525, 2542,    0, 2589, 2775, 2780, 2782,
     3410, 8470, 2442, 2388, 8470, 8470, 2710, 2768, 2801, 3328,
        0,    0,    0,    0, 3323, 3281,    0, 2266, 3252, 8470,
     8470, 3224, 2758, 2762, 2683, 8470, 2683, 2667, 2731, 2755,
     2764, 2755, 2763, 2775, 2783, 2787, 2595, 2789, 2771, 2788,
     2780, 2781, 2842, 2831, 2367,    9, 3177, 3062, 2909, 3050,

     2559, 2230, 3052, 3011,    0, 2841, 2852,    0, 8470, 2844,
     2841, 2848, 2847, 2858, 8470, 2859, 2829, 8470, 3050, 8470,
     2874, 2864, 3029, 2924, 2895, 2900, 2928, 8470, 2864, 2864,
     8470, 8470, 2906, 2904, 3009, 2451, 2908, 2882, 2912, 2917,
     3001, 8470, 2919, 2994, 2951, 2983, 2973, 2955, 8470, 2951,
     2987, 3026, 2949, 2941, 2905, 2920, 2932, 2935, 2998, 2948,
     2836, 2912, 3007, 2925, 2996, 3011, 3000, 3041, 3044, 3007,
     3048, 3011, 3012, 3005, 3016, 3017, 3031, 3023, 3029, 3030,
     3026, 3046, 3047, 3031, 3044, 3039, 3094, 3049, 2839, 2833,
     3052, 3108, 3043, 3114, 8470, 2826, 2788, 2773, 3060, 2753,

     3120, 3123, 1955, 2805, 3134, 3137, 3144, 3082, 2747, 3117,
     3087, 3149, 8470, 2823, 8470, 2870, 3127, 3096, 2732, 2699,
     3101, 3150, 3165, 3168, 2592, 2596, 2574, 3181, 2577, 3116,
     3185, 3120, 3122, 3115, 3132, 3136, 3147, 3137, 2485, 3192,
     8470, 3195, 3138, 3140, 3150, 3160, 3168, 3171, 3164, 3173,
     3182, 3185, 3178, 3173, 3180, 3183, 3177, 3184, 3223, 2464,
     8470, 8470, 3197, 3250, 8470, 2456, 2424, 3260, 3190, 3263,
     3266, 1999, 8470, 3269, 3277, 3280, 2418, 3232, 2995, 8470,
     3284, 8470, 3287, 3234, 3290, 3294, 3309,    0, 2390, 2389,
     2350, 2250, 2291, 3252, 3259, 3262, 3264, 3269, 3270, 3267,

     3277, 2211, 3315, 3285, 3198, 3285, 3284, 3275, 3276, 3285,
     3279, 3300, 3304, 8470, 3296, 3306, 3298, 3299, 3316, 3305,
     8470, 3245, 3362, 8470, 3317, 3368, 3379, 3382, 3385, 3390,
        0, 3337, 3394, 3407, 2282, 2245, 2223, 2217, 2070, 3412,
     3357, 3342, 3360, 3359, 3352, 3357, 3381, 3368, 3379,    0,
     3371, 3385, 3430, 3435, 3385, 3438, 8470, 3384, 3387, 3380,
     3394, 3402, 3416, 3410, 3453, 8470,    0, 3464, 3478, 3481,
     3485, 3489,    0, 3415, 3493, 3506, 3511, 2113, 2110, 2020,
     3435,    0, 3427, 3455, 3516, 3521, 3458, 3525, 3461, 8470,
     3529, 3470, 3532, 3496, 3498, 3498, 3503, 3504, 3498, 3507,

     8470, 3550, 3573, 3576, 3579, 3584, 3440, 3553, 3601, 3590,
     8470, 1953, 1659, 1655, 3548, 8470, 3606, 3539, 3611, 3557,
     3617, 3559, 3560, 3559, 3560, 3565, 3566, 3571, 3630, 3633,
     3644, 3658, 3665, 8470, 3670, 3673, 1613, 1605, 1595, 3584,
     3686, 3575, 3587, 3592, 3619, 8470, 8470, 3623, 8470, 3690,
     3693, 3696, 3704, 3717, 3725, 3729, 1565, 1568, 1555, 3632,
     3739, 3668, 8470, 3665, 3744, 3747, 3750, 3758, 3761, 3775,
     3785, 1507, 1361, 1266, 3790, 3691, 8470, 3796, 3799, 3803,
     3810, 3813, 3840, 3843, 1248, 1251, 1202, 3706, 3853, 3856,
     3859, 3878,  933,  915,  760, 8470, 3883, 3893,  749,  628,

      569, 3898, 3904,  557,  544,  454, 3909, 3915,  347, 8470,
     3920, 3926, 3936, 3939, 3949, 3952, 3962, 3965, 3975, 3978,
     3988, 3991, 4001, 4004, 4014, 4017, 4027, 4030, 4040, 4043,
     4053, 4056, 4066, 4069, 4079, 4082, 4092, 4095, 4105, 4108,
     4118, 4121, 4131, 4134, 4144, 4147, 4157, 4160, 4170, 4173,
     4183, 4186, 4196, 4199, 4209, 4212, 4222, 4225, 4235, 4238,
     4248, 4251, 4261, 4264, 4274, 4277, 4287, 4290, 4300, 4303,
     4313, 4316, 4326, 4329, 4339, 4342, 4352, 4355, 4365, 4368,
     4378, 4381, 4391, 4394, 4404, 4407, 4417, 4420, 4430, 4433,
     4443, 4446, 4456, 4459, 4469, 4472, 4482, 4485, 4495, 4498,

     4508, 4511, 4521, 4524, 4534, 4537, 4547, 4550, 4560, 4563,
     4573, 4576, 4586, 4589, 4599, 4602, 4612, 4615, 4625, 4628,
     4638, 4641, 4651, 4654, 4664, 4667, 4677, 4680, 4690, 4693,
     4703, 4706, 4716, 4719,  345, 4729, 4735, 4741, 4747, 4753,
     4759, 4765, 8470, 4772, 4793, 4814, 4835, 4856, 4877, 4898,
     4919, 4940, 4961, 4982, 5003, 5024, 5045, 5066, 5087, 5108,
     5129, 5150, 5171, 5192, 5213, 5234, 5255, 1312, 1497, 2007,
     2682, 5276, 5297, 5318, 5339, 5360, 5379, 5398, 5419, 5440,
     5461, 5482, 5503, 5524, 5545, 5566, 5587, 5608, 5627, 5646,
     5665, 5683, 2739, 3259, 5702, 5723, 5742, 5763, 5784, 5805,

     5826, 5847, 5868, 3341, 3361, 3532, 5889, 3533, 5910, 5931,
     5950, 5969, 3545, 3623, 3667, 5990, 6011, 3686, 6032, 6053,
     6074, 6095, 6116, 6137, 6158, 6177, 6196, 6217, 6238, 6259,
     6280, 6301, 6322, 6343, 6362, 6381, 6400, 6418, 3699, 6437,
     6458, 6477, 6498, 6519, 6540, 6561, 6582, 6603, 3707, 3753,
     3804, 3805, 6624, 6645, 6664, 6683, 6704, 6725, 3811, 6746,
     6767, 3813, 6788, 6809, 6830, 6851, 6872, 6893, 6914, 6933,
     6952, 6973, 6994, 7015, 7036, 7057, 7078, 7099, 7120, 7141,
     7160, 7181, 7202, 7223, 7244, 7265, 3835, 7286, 7307, 7328,
     7349, 7370, 3818, 7391, 7410, 7429, 7450, 7469, 7488, 7509,

     7530, 7551, 7572, 7593, 7614, 7635, 7656, 7677, 7696, 7717,
     3849, 7738, 7759, 7780, 7801, 7822, 7843, 7864, 7885, 7904,
     7923, 7944, 7965, 7986, 3851, 8007, 8028, 8049, 8070, 8091,
     8112, 8133, 8154, 8175, 8196, 8217, 8238, 8259, 8280, 8301,
     8322, 8343, 8364, 8385, 8406, 8427, 8448
    } ;

static const flex_int16_t yy_def[1648] =
    {   0,
     1444, 1444, 1444, 1443, 1443,    5, 1443,    7, 1445, 1445,
     1446, 1446, 1443,   13, 1447, 1447, 1448, 1448, 1449, 1449,
     1450, 1450, 1451, 1451, 1452, 1452, 1443,   27, 1453, 1453,
     1443,   31, 1443,   33, 1443,   35, 1454, 1455, 1444, 1444,
     1444, 1444, 1456, 1456, 1457, 1457, 1443,   47, 1456, 1456,
     1458, 1458, 1459, 1459, 1460, 1460, 1443,   57, 1443,   59,
     1443,   61, 1461, 1461, 1462, 1462, 1443,   67, 1463, 1463,
     1464, 1464, 1465, 1465, 1466, 1466,   76,   76, 1467, 1467,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1468, 1469, 1469,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1470, 1470, 1470,
     1470, 1470, 1470, 1470, 1470, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1471, 1471, 1471, 1471, 1443, 1472, 1472, 1443,
     1472, 1443, 1473, 1443, 1472, 1472, 1472, 1474, 1474, 1474,
     1443, 1474, 1474, 1475, 1474, 1474, 1443, 1443, 1443, 1443,
     1443, 1476, 1443, 1443, 1443, 1477, 1477, 1477, 1477, 1477,
     1478, 1443, 1443, 1477, 1443, 1479, 1479, 1443, 1479, 1479,
     1480, 1479, 1479, 1481, 1481, 1481, 1481, 1481, 1481, 1482,
     1482, 1443, 1482, 1482, 1483, 1482, 1482, 1484, 1484, 1443,
     1484, 1484, 1485, 1484, 1484, 1486, 1486, 1486, 1486, 1487,

     1486, 1486, 1486, 1486, 1488, 1488, 1488, 1488, 1488, 1488,
     1488, 1489, 1489, 1490, 1490, 1443, 1490, 1490, 1490, 1443,
     1490, 1490, 1491, 1491, 1443, 1443, 1443, 1443, 1443, 1492,
     1443, 1492, 1443, 1443, 1443, 1443, 1443, 1443, 1493, 1443,
     1443, 1443, 1443, 1494, 1443, 1494, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1495, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1496, 1443, 1443, 1496, 1443,
     1443, 1496, 1443, 1443, 1496, 1496, 1496, 1443, 1443, 1443,
     1497, 1497, 1443, 1497, 1443, 1497, 1497, 1497, 1497, 1498,
     1498, 1443, 1498, 1443, 1498, 1498, 1494, 1498, 1494, 1498,

     1443, 1443, 1443, 1496, 1443, 1443, 1443, 1499, 1500, 1443,
     1499, 1501, 1499, 1443, 1499, 1499, 1502, 1443, 1443, 1502,
     1443, 1502, 1502, 1502, 1502, 1503, 1443, 1503, 1503, 1503,
     1503, 1503, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1504,
     1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1443,
     1504, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1505, 1443,
     1505, 1443, 1443, 1506, 1506, 1443, 1443, 1443, 1443, 1443,
     1443, 1507, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1507, 1443, 1443, 1508, 1508, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1509, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1510, 1443, 1443, 1443, 1443, 1511, 1443,
     1443, 1443, 1511, 1443, 1512, 1512, 1443, 1512, 1443, 1443,
     1512, 1443, 1512, 1512, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1513, 1514, 1513, 1514, 1514, 1515, 1515, 1515, 1515,
     1515, 1515, 1515, 1515, 1515, 1515, 1515, 1516, 1517, 1518,
     1518, 1518, 1518, 1518, 1519, 1520, 1521, 1519, 1519, 1522,
     1523, 1524, 1522, 1443, 1522, 1443, 1525, 1443, 1443, 1443,
     1526, 1526, 1526, 1527, 1526, 1443, 1443, 1443, 1526, 1528,
     1528, 1528, 1528, 1443, 1528, 1529, 1529, 1529, 1529, 1529,

     1530, 1530, 1530, 1530, 1443, 1530, 1531, 1531, 1531, 1531,
     1443, 1531, 1532, 1533, 1533, 1532, 1532, 1532, 1532, 1534,
     1443, 1534, 1534, 1534, 1534, 1443, 1443, 1535, 1535, 1536,
     1443, 1536, 1536, 1536, 1443, 1443, 1536, 1443, 1443, 1443,
     1537, 1443, 1537, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1538, 1443, 1538, 1443, 1443, 1443, 1443, 1443, 1443,
     1539, 1443, 1443, 1539, 1443, 1540, 1443, 1541, 1443, 1443,
     1443, 1541, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1541, 1541, 1443, 1443, 1443, 1443, 1443, 1443,
     1542, 1443, 1542, 1542, 1542, 1543, 1543, 1443, 1543, 1543,

     1443, 1543, 1443, 1443, 1443, 1443, 1541, 1443, 1443, 1443,
     1443, 1443, 1443, 1544, 1545, 1546, 1546, 1546, 1544, 1443,
     1443, 1544, 1547, 1443, 1443, 1547, 1547, 1547, 1548, 1548,
     1548, 1548, 1548, 1549, 1549, 1549, 1549, 1549, 1549, 1549,
     1549, 1549, 1549, 1443, 1443, 1549, 1550, 1443, 1550, 1551,
     1551, 1443, 1443, 1443, 1552, 1552, 1443, 1443, 1553, 1554,
     1443, 1443, 1443, 1443, 1443, 1443, 1555, 1555, 1556, 1443,
     1443, 1556, 1443, 1443, 1556, 1443, 1443, 1443, 1443, 1557,
     1443, 1558, 1559, 1559, 1559, 1559, 1559, 1443, 1559, 1559,
     1559, 1559, 1559, 1559, 1560, 1560, 1561, 1561, 1562, 1562,

     1562, 1443, 1562, 1562, 1563, 1443, 1443, 1443, 1564, 1565,
     1566, 1565, 1567, 1568, 1567, 1569, 1443, 1443, 1443, 1443,
     1443, 1570, 1571, 1443, 1572, 1572, 1572, 1573, 1573, 1573,
     1574, 1574, 1574, 1575, 1575, 1575, 1576, 1576, 1577, 1577,
     1577, 1578, 1578, 1578, 1443, 1579, 1579, 1579, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1580, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1580, 1443,
     1443, 1443, 1581, 1581, 1582, 1582, 1443, 1443, 1443, 1580,
     1443, 1443, 1443, 1583, 1583, 1584, 1583, 1443, 1443, 1443,

     1443, 1585, 1585, 1586, 1586, 1586, 1587, 1587, 1587, 1587,
     1587, 1587, 1443, 1587, 1587, 1443, 1443, 1588, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1589, 1443, 1443, 1590,
     1591, 1443, 1592, 1443, 1593, 1593, 1593, 1593, 1593, 1593,
     1593, 1593, 1593, 1593, 1593, 1594, 1595, 1595, 1595, 1595,
     1596, 1443, 1443, 1597, 1443, 1443, 1443, 1443, 1598, 1599,
     1600, 1601, 1602, 1603, 1604, 1604, 1605, 1606, 1607, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1608, 1443, 1443, 1443, 1443, 1443,

     1608, 1443, 1443, 1443, 1609, 1443, 1443, 1610, 1443, 1611,
     1611, 1611, 1611, 1611, 1443, 1611, 1611, 1443, 1612, 1443,
     1443, 1443, 1613, 1614, 1443, 1443, 1443, 1443, 1593, 1593,
     1443, 1443, 1443, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
     1593, 1443, 1443, 1595, 1595, 1595, 1443, 1443, 1443, 1443,
     1443, 1598, 1615, 1616, 1616, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1611, 1611, 1611,
     1611, 1611, 1611, 1443, 1443, 1443, 1443, 1443, 1443, 1614,

     1614, 1614, 1443, 1614, 1443, 1443, 1443, 1593, 1593, 1443,
     1443, 1593, 1443, 1443, 1443, 1593, 1593, 1593, 1593, 1443,
     1443, 1595, 1443, 1598, 1617, 1618, 1618, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1619, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1611,
     1443, 1443, 1611, 1443, 1443, 1443, 1611, 1443, 1443, 1614,
     1614, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1620, 1443, 1593, 1443, 1443, 1443, 1443, 1621, 1622, 1623,
     1623, 1624, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1619, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1611, 1443, 1443, 1443, 1614, 1614, 1443, 1443, 1443,
     1625, 1443, 1443, 1443, 1621, 1626, 1627, 1627, 1624, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1628,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1629, 1614, 1614, 1443,
     1443, 1443, 1625, 1443, 1443, 1443, 1443, 1630, 1631, 1631,
     1443, 1632, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1614, 1614, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1633, 1634, 1634, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1614, 1614,
     1443, 1443, 1443, 1443, 1443, 1443, 1635, 1636, 1636, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1614,
     1614, 1443, 1443, 1443, 1443, 1443, 1637, 1638, 1638, 1443,
     1443, 1443, 1443, 1443, 1614, 1614, 1443, 1443, 1443, 1443,
     1443, 1639, 1640, 1640, 1443, 1443, 1443, 1614, 1614, 1443,
     1443, 1443, 1443, 1443, 1641, 1642, 1642, 1443, 1614, 1614,
     1443, 1443, 1643, 1644, 1644, 1443, 1443, 1443, 1645, 1646,

     1646, 1443, 1443, 1647, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443,    0, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443
    } ;

static const flex_int16_t yy_nxt[8557] =
    {   0,
     1443,   83, 1443,   84,   85,   83, 1443,   84,   85,   83,
      521,   84,   85,  526,  435,  435,  435,   86,  436,  436,
      436,   86,  527,  458,  458,   86,   87,  459,  459,  521,
       87,  521,  449,  463,   87,  452,  487,  488,  521,  450,
      448,  451,  453,  454,  456,  455,  461,  471,  462,  435,
      521,  472,  550,  436,  479,  479,  479,  521,  535,  536,
      531,  449,  463,  480,  452,  586,  551,  450,  448,  451,
      453,  454,  456,  455,  461,  491,  462,  497,  502,  492,
      544,  498,  503,  534,   88,   89,  445,  445,   88,   89,
      545,  587,   88,   89,   90,   91,   92,   93,   94,   90,

       90,   95,   90,   90,   90,   90,   90,   90,   90,   90,
       90,   96,   90,   90,   90,   90,   90,   90,   90,   90,
       97,   90,   98,   98,   98,   98,   98,   98,   98,   98,
       98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
       98,   98,   98,   98,   98,   98,   90,   90,   90,   98,
       90,   98,   98,   98,   98,   98,   98,   98,   98,   98,
       98,   98,   98,   98,   98,   98,   98,   98,   98,   98,
       98,   98,   98,   98,   90,   90,   90,   99,  100,  101,
      102,  103,  102,  104,  105,  102,  102,  102,  102,  102,
      102,  102,  102,  102,  102,  102,  102,  106,  102,  102,

      102,  102,  102,  102,  102,  102,  107,  102,  108,  108,
      109,  110,  111,  108,  108,  108,  112,  108,  108,  108,
      108,  108,  108,  113,  108,  108,  108,  108,  114,  108,
      108,  108,  102,  102,  102,  108,  102,  108,  108,  109,
      110,  111,  108,  108,  108,  112,  108,  108,  108,  108,
      108,  113,  108,  108,  108,  108,  114,  108,  108,  108,
      102,  102,  102,  108,  115,  116,  117,  118,  117,  119,
      120,  117,  117,  117,  117,  117,  117,  117,  117,  117,
      117,  117,  117,  121,  117,  117,  117,  117,  117,  117,
      117,  117,  122,  117,  123,  123,  123,  123,  124,  123,

      123,  123,  125,  123,  123,  123,  123,  123,  123,  123,
      123,  123,  123,  123,  123,  123,  123,  123,  117,  117,
      117,  123,  117,  123,  123,  123,  123,  124,  123,  123,
      123,  125,  123,  123,  123,  123,  123,  123,  123,  123,
      123,  123,  123,  123,  123,  123,  117,  117,  117,  123,
      126,  127,  129,  531,  130,  131,  480,  132,  724,  555,
      129,  133,  130,  131,  556,  132,  615,  508,  134,  133,
      139,  509,   84,  140,  521,  141,  134,  135,  139,  566,
       84,  140,  616,  141,  567,  135,  142,  516,  479,  479,
      479,  517,  521,  521,  142,  143,  521,  480,  479,  479,

      479,  521,  484,  143,  531,  559,  458,  480,  522,  560,
      459,  521,  523,  458,  532,  521,  524,  459,  533,  600,
      521,  570,  144,  562,  563,  571,  605,  606,  435,  615,
      144,  483,  593,  537,  604,  136,  137,  617,  436,  644,
      645,  618,  615,  136,  137,  616,  597,  531,  625,  657,
      658,  525,  626,  145,  146,  605,  606,  746,  616,  483,
     1310,  145,  146,  147,  148,  147,  149,  150,  147,  151,
      147,  147,  147,  152,  147,  147,  147,  147,  147,  147,
      153,  147,  147,  147,  147,  147,  147,  147,  147,  154,
      155,  156,  156,  156,  156,  157,  156,  156,  156,  156,

      156,  156,  158,  156,  156,  156,  156,  156,  159,  156,
      156,  160,  156,  156,  156,  147,  161,  147,  156,  147,
      156,  156,  156,  156,  157,  156,  156,  156,  156,  156,
      158,  156,  156,  156,  156,  156,  159,  156,  156,  160,
      156,  156,  156,  162,  163,  147,  156,  164,  165,  167,
     1310,   84,   85,  167,  168,   84,   85,  175,  168,   84,
       85,  175,  168,   84,   85,  169,  168,  526,  724,  169,
      479,  479,  479,  176,  170, 1306,  527,  176,  170,  480,
      601,  602,  177,  479,  479,  479,  177,  181,  550,   84,
       85,  181,  480,   84,   85,  630,  182,  615,  521,  631,

      182,  171,  551,  183,  615,  171,  189,  183,   84,   85,
      635,  190,  184,  616,  538,  539,  184,  521,  482,  711,
      616,  435,  191,  540,  435,  599,  538,  539,  436,  619,
      597,  192,  172,  173, 1306,  540,  172,  173,  635,  185,
      178,  179,  531,  185,  178,  179,  482,  189,  529,   84,
       85,  197,  190,  198,  199,  636,  747,  197,  193,  198,
      199,  597,  200,  191,  489,  542,  711,  201,  200,  554,
      186,  187,  192,  201,  186,  187,  202,  542,  206,  622,
       84,  207,  202,   82,  636,  215,  637,  216,  217,  194,
      195,  638,  531,  206,  208,   84,  207,  639,   82,  193,

      640,  218,   82,  209,  479,  479,  479,  543,  641,  208,
      219,  642,  756,  480,  637,  643,  620,   82,  209,  621,
      638,  576,  485,  435,  757,  652,  639,  436,  640,  653,
      194,  195,  665,  666,  203,  204,  641,  220,  683,  642,
      203,  204,  620,  643,  684,  435,  691,  483,  621,  436,
      576,  435,  661,  662,  435,  436,  436,  663,  436,  670,
      724,  210,  211,  671,  445,  445, 1301,  683,  221,  222,
      708,  708,  537,  684,  691,  483,  210,  211,   82,   83,
       82,   84,   85,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   86,   82,   82,   82,   82,

       82,   82,   82,   82,   87,   82,  212,  212,  212,  212,
      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
       82,   82,   82,  212,   82,  212,  212,  212,  212,  212,
      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
      212,  212,  212,  212,  212,  212,  212,  212,   82,   82,
       82,  212,  213,   89,  215,  584,  216,  217,  673,  687,
      692,  685,  678,  674,  681,  693,  585,  678,  678,  678,
      218,  686,  678,  682,  678,  694,  699,  544,  701,  219,
      678,  678,  678,  550,  673,  714,  700,  545,  687,  692,

      685,  526,  674,  719,  693,  770,  715,  551,  555,  686,
      527,  720,  720,  556,  694,  699,  220,  701,  771,  586,
      709, 1301,  521,  754,  700,  678,  709,  709,  526,  742,
      709,  755,  678,  770,  721,  721,  721,  527,  709,  709,
      709,  521,  714,  480,  724,  587,  771,  221,  222,   82,
       83,   82,   84,   85,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   86,   82,   82,   82,
       82,   82,   82,   82,   82,   87,   82,  223,  223,  223,
      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,

      223,   82,   82,   82,  223,   82,  223,  223,  223,  223,
      223,  223,  223,  223,  223,  223,  223,  223,  223,  223,
      223,  223,  223,  223,  223,  223,  223,  223,  223,   82,
       82,   82,  223,  224,   89,   82,   83,  225,   84,   85,
       82,   82,   82,   82,   82,   82,  226,  227,   82,  228,
       82,  229,   86,   82,   82,   82,   82,   82,   82,   82,
       82,   87,   82,  230,  230,  230,  230,  230,  230,  230,
      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
      230,  230,  230,  230,  230,  230,  230,   82,  231,   82,
      230,   82,  230,  230,  230,  230,  230,  230,  230,  230,

      230,  230,  230,  230,  230,  230,  230,  230,  230,  230,
      230,  230,  230,  230,  230,   82,   82,   82,  230,  232,
       89,  233,  234,  235,  236,  237,  233,  238,  239,  233,
      233,  240,  233,  233,  233,  233,  233,  233,  241,  233,
      233,  233,  233,  233,  233,  233,  233,  242,  243,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  233,  245,  233,  244,  233,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,
      244,  244,  244,  244,  244,  244,  244,  244,  244,  244,

      244,  233,  233,  233,  244,  246,  247,  249, 1295,  250,
      251,  257,  258,  259,  260,  821,  821,  261,   83,  607,
       84,   85,   83,  252,   84,   85,   83,  262,   84,   85,
      608,  550,  253,  588,   86,  611,  263,   83,   86,   84,
       85,  772,   86,   87,  585,  551,  608,   87,  569,  711,
      603,   87,  267,   86,  268,  269,  712, 1295,  282,  724,
      283,  284,   87,  282,  270,  283,  284,  521,  271,  772,
      285,  681, 1287,  609,  286,  285,  679,  272,  273,  286,
      682,  521,  774,  287,  773,  680,  521,  586,  287,  609,
      254,  255,  743,  775,  264,  265,  711,  538,  539,  610,

      521,   88,   89,  566,  273,   88,   89,  274,  567,   88,
       89,  774,  773,  587,  749,  610,  479,  479,  479,  676,
       88,   89,  775,  569,  785,  480,  788,  444,  776,  309,
      444,  310,  311,  274,  526,  275,  276,  267,  277,  268,
      269,  288,  289,  527,  525,  312,  288,  289,  778,  278,
      714,  777,  446,  271,  313,  314,  776,  445,  445,  716,
      597,  601,  272,  273,  716,  716,  716, 1287,  787,  716,
      714,  716,  788,  798,  615,  762,  778,  716,  716,  716,
      777,  314,  479,  479,  479,  807,  484,  810,  727,  273,
      616,  480,  279,  727,  727,  727,  787,  714,  727,  789,

      727,  823,  798,  615,  762,  800,  727,  727,  727,  824,
      801,  597,  315,  316,  807,  529,  810,  714,  280,  616,
      275,  276,  290,  291,  290,  292,  293,  290,  290,  290,
      290,  290,  290,  290,  290,  294,  290,  290,  290,  295,
      290,  290,  290,  290,  290,  290,  290,  290,  296,  290,
      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
      297,  297,  297,  297,  290,  298,  290,  297,  290,  297,
      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,
      297,  297,  297,  297,  297,  297,  297,  297,  297,  297,

      297,  297,  290,  290,  290,  297,  299,  300,  267,  799,
      268,  269,  445,  762,  309,  445,  310,  311,  724,  318,
      301,  319,  320,  688,  302,  615,  688,  479,  479,  479,
      312,  321,  688,  272,  303,  322,  480,  799,  679,  313,
      314,  616,  762,  318,  323,  319,  320,  680,  327,  808,
      310,  328,  689,  825,  327,  321,  310,  328,  681,  322,
      303, 1274,  690,  274,  329,  826,  314,  682,  323,  779,
      329,  588,  722,  330, 1274,  702,  724,  808,  702,  330,
      585,  689,  585,  367,  702,   84,  368,  521,  369,  274,
      690,  275,  276,  267,  304,  268,  269,  315,  316,  370,

      722, 1259,  324,  325,  703,  305,  521,  622,  371,  302,
      730, 1259,  538,  539,  704,  730,  730,  730,  272,  303,
      730,  540,  730,  586,  724,  586,  324,  325,  730,  730,
      730,  331,  332,  703,  733,  372,  809,  331,  332,  678,
      733,  733,  704,  811,  733,  303,  733,  812,  306,  587,
      736,  587,  733,  733,  733,  736,  736,  736,  831,  832,
      736, 1239,  736,  542,  809, 1239,  373,  374,  736,  736,
      736,  811,  831,  832,  307,  812,  275,  276,  333,  334,
      333,  335,  336,  333,  333,  333,  333,  333,  333,  333,
      333,  333,  333,  333,  333,  337,  333,  333,  333,  333,

      333,  333,  333,  333,  338,  339,  340,  341,  342,  343,
      344,  345,  344,  344,  344,  344,  344,  344,  344,  346,
      347,  344,  344,  344,  344,  348,  344,  344,  349,  344,
      333,  350,  333,  344,  333,  340,  341,  342,  343,  344,
      345,  344,  344,  344,  344,  344,  344,  346,  347,  344,
      344,  344,  344,  348,  344,  344,  349,  344,  333,  333,
      333,  344,  351,  352,  353,  354,  353,  355,  356,  353,
      353,  353,  353,  353,  353,  353,  353,  353,  353,  353,
      353,  357,  353,  353,  353,  353,  353,  353,  353,  353,
      358,  353,  359,  359,  359,  359,  359,  359,  359,  359,

      359,  359,  359,  359,  359,  359,  359,  359,  359,  359,
      359,  359,  359,  359,  359,  359,  353,  360,  353,  359,
      353,  359,  359,  359,  359,  359,  359,  359,  359,  359,
      359,  359,  359,  359,  359,  359,  359,  359,  359,  359,
      359,  359,  359,  359,  353,  353,  353,  359,  361,  362,
      353,  354,  353,  355,  356,  353,  353,  353,  353,  353,
      353,  353,  363,  353,  353,  353,  353,  357,  353,  353,
      353,  353,  353,  353,  353,  353,  358,  353,  364,  364,
      364,  364,  364,  364,  364,  364,  364,  364,  364,  364,
      364,  364,  364,  364,  364,  364,  364,  364,  364,  364,

      364,  364,  353,  360,  353,  364,  353,  364,  364,  364,
      364,  364,  364,  364,  364,  364,  364,  364,  364,  364,
      364,  364,  364,  364,  364,  364,  364,  364,  364,  364,
      353,  353,  353,  364,  365,  362,  367,  550,   84,  368,
      376,  369,   84,  377,  376,  836,   84,  377,  837,  378,
      838,  551,  370,  378,  814,  815,  379, 1072, 1073,  828,
      379,  371,  835,  842,  724,  380,  741,  843,  839,  380,
      521,  741,  741,  678,  836,  840,  741,  837,  741,  838,
      841,  844,  814,  815,  741,  741,  741,  828,  372,  521,
      835,  842,  381,  744,  521,  843,  381,  839,  744,  744,

      744, 1072, 1073,  744,  840,  744,  852,  531,  856,  841,
      844,  744,  744,  745,  853,  853,  857,  857,  554,  373,
      374,  869,  447,  382,  383,  447, 1214,  382,  383,   82,
       83,   82,   84,   85,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   86,   82,   82,   82,
       82,   82,   82,   82,   82,   87,   82,  384,  384,  384,
      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,
      384,   82,   82,   82,  384,   82,  384,  384,  384,  384,
      384,  384,  384,  384,  384,  384,  384,  384,  384,  384,

      384,  384,  384,  384,  384,  384,  384,  384,  384,   82,
       82,   82,  384,  385,   89,  387, 1214,  104,  388,  387,
      780,  104,  388,  395,  724,  396,  397,  845,  398,  538,
      539,  389,  399,  400,  401,  389,  791,  873,  540,  402,
      390,  540,  896,  847,  390,  479,  479,  479,  403,  404,
      395, 1140,  396,  397,  480,  398,  845,  874,  848,  399,
      400,  401,  849,  850,  703,  873,  402,  391,  479,  479,
      479,  391,  847,  875,  586,  403,  404,  480,  711,  408,
      542,   84,  409,  542,  410,  874,  790,  848,  411,  854,
      609,  849,  850,  703,  611,  412,  586,  608,  392,  393,

      587,  875,  392,  393,  413,  608,  405,  406,  876,  879,
      543,  483,  408,  521,   84,  409,  610,  410,  858,  858,
      858,  411,  587, 1180,  868,  711,  489,  480,  412, 1180,
      800,  414,  521,  405,  406,  801,  880,  413,  879,  483,
      609,  882,  426,  878,  427,  428,  429,  881,  609,  870,
      870,  870,  877,  883,  429,  888,  724,  426,  430,  427,
      428,  429,  415,  416,  414,  880,  610,  431,  432,  429,
      882,  878,  521,  430,  610,  881,  479,  479,  479,  884,
      876,  883,  431,  432,  888,  480,  609,  889, 1177,  885,
      890,  521, 1103, 1093,  432,  415,  416,  417,  418,  886,

       84,  420,  891,  417,  417,  417,  859,  417,  884,  432,
      417,  417,  610,  892,  421,  889,  887,  885,  890,  417,
      417,  417,  417,  422,  417,  433,  434,  759,  886,  893,
      891, 1140,  759,  759,  759,  859,  899,  759,  900,  678,
      433,  434,  892,  894,  887,  759,  759,  759,  902,  417,
      417,  417,  531,  417,  748, 1443, 1138,  893, 1443,  748,
      748,  748,  915,  922,  748,  899,  748,  900, 1443,  895,
      906,  894,  748,  748,  748,  907,  930,  417,  417,  417,
      585,  423,  424,  417,  418,  917,   84,  420, 1443,  417,
      417,  417,  922,  417,  711, 1138,  417,  417,  906,  912,

      421,  724,  609,  907,  930,  417,  417,  417,  417,  422,
      417,  784,  914,  929,  917,  916,  784,  784,  784,  938,
     1077,  784,  913,  784,  920,  935, 1124,  912,  610,  784,
      784,  784,  921,  921,  615,  417,  417,  417,  796,  417,
      914,  711,  929,  796,  796,  796,  931,  938,  796,  931,
      797,  913,  706, 1014,  935,  931,  796,  796,  796, 1065,
      948,  948, 1015,  417,  417,  417, 1121,  423,  424,  439,
      439,  440,  439,  439,  439,  439,  441,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  442,  442,  442,

      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  439,  439,  439,  442,  439,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  439,
      439,  439,  443,  443,  439,  573,  936,  937,  574,  575,
      576,  901,  939,  577,  803,  940, 1103,  578,  579,  803,
      803,  803,  608,  580,  803,  941,  803,  581,  582, 1093,
     1091,  573,  803,  803,  803,  936,  937,  574,  575,  576,
      939,  942,  577,  940,  942,  578,  579,  971,  971,  971,

      942,  580, 1091,  724,  941,  581,  582,  439,  439,  440,
      439,  439,  439,  439,  441,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,  439,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  439,
      439,  439,  442,  439,  442,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
      442,  442,  442,  442,  442,  442,  442,  439,  439,  439,
      443,  443,  439,  760,  761,  762,  763,  460,  764,  786,

      460, 1020,  765,  766,  786,  786,  786,  962,  767,  786,
      895,  786,  768,  769,  960,  901,  961,  786,  786,  786,
      949,  585,  760,  761,  762,  763,  608,  764,  950,  950,
      765,  766,  806, 1443, 1084,  962,  767,  806,  806,  806,
      768,  769,  806,  960,  806,  961,  558,  597,  678, 1077,
      806,  806,  806,  827,  827,  827, 1443,  558,  827,  910,
      678,  925,  926,  927,  586, 1003,  827,  827,  827,  609,
      951,  951,  951,  911,  927,  927,  927,  943,  963,  480,
     1443,  928, 1443,  819, 1443, 1443, 1443, 1443,  910,  956,
      587, 1443,  958, 1443,  928,  610,  964,  965,  819,  957,

      966,  911,  967,  479,  479,  479,  963,  968, 1443,  959,
      973,  944,  480,  945,  969,  946,  970, 1003,  956,  972,
      974,  958,  975,  976,  964, 1014,  965,  957,  966,  995,
      967,  994,  995,  996, 1015, 1062,  968,  959,  973,  928,
      944, 1061,  945,  969,  946,  970,  952,  876,  972,  974,
      975,  976,  928,  932,  932,  933,  932,  932,  932,  932,
      932,  932,  932,  932,  932,  932,  932,  932,  932,  932,
      932,  977, 1079,  978,  952,  932,  932,  932,  932,  932,
      932, 1080,  957,  987,  819,  988,  989,  990,  991,  934,
      992,  993,  998,  998,  999, 1008, 1009, 1005, 1006, 1007,

      977,  978, 1007, 1007, 1007,  932,  932,  932, 1010,  932,
      957, 1027,  987,  988,  989,  990,  991,  928,  934,  992,
      993,  943,  928,  999, 1008, 1009, 1001,  926, 1002, 1017,
     1007, 1007, 1007,  932,  932,  932, 1003, 1012,  932,  979,
      980, 1016, 1011, 1018,  981, 1019, 1004, 1027,  982,  983,
      928, 1033, 1028, 1443,  984, 1021, 1443, 1017,  985,  986,
      724,  949, 1443, 1029, 1030,  706, 1012, 1035,  979,  980,
     1016, 1011, 1018,  981, 1019,  928,  982,  983, 1032, 1033,
      928, 1028,  984,  706, 1021,  702,  985,  986,  702, 1023,
     1023, 1023, 1029, 1030,  702, 1035, 1443, 1079,  480, 1443,

     1031, 1031, 1031, 1020, 1004, 1443, 1080, 1032,  928, 1013,
     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1022,  479,  479,
      479, 1013, 1013, 1013, 1013, 1013, 1013,  480, 1036, 1034,
     1037,  924, 1038,  971,  971,  971, 1040, 1041, 1042, 1043,
      971,  971,  971, 1044, 1045, 1046, 1022, 1047, 1048, 1049,
      819, 1013, 1013, 1013, 1050, 1013, 1036, 1024, 1034, 1037,
     1038, 1051, 1052, 1053, 1054, 1055, 1057, 1043, 1056, 1058,
     1060, 1044, 1045, 1046, 1063, 1047, 1048, 1067, 1049, 1013,
     1013, 1013, 1050,  904, 1013, 1024, 1059, 1041, 1042, 1051,

     1052, 1053, 1069, 1054, 1055, 1057, 1056, 1058,  903, 1060,
     1064, 1065, 1066, 1063,  449, 1067, 1068,  995,  996, 1010,
     1078, 1039, 1070, 1006, 1071, 1071, 1007, 1071, 1083, 1081,
     1069,  788, 1003, 1082, 1085, 1003, 1074, 1075, 1076, 1076,
     1076, 1076, 1004,  449,  898, 1004, 1076, 1076, 1076, 1078,
     1082,  931,  942, 1011,  931,  942,  928, 1083, 1094,  928,
      931,  942, 1095, 1085, 1096, 1097,  928, 1086, 1086, 1086,
     1087, 1087, 1087, 1098, 1088, 1100,  480, 1099, 1101,  480,
     1104, 1105, 1011, 1031, 1031, 1031, 1094, 1031, 1031, 1031,
     1095, 1106, 1096, 1097, 1040, 1041, 1042, 1042, 1041, 1042,

     1004, 1098, 1107, 1004, 1100, 1099, 1101, 1108, 1104, 1105,
     1109, 1110, 1111, 1112,  928, 1113, 1118,  928, 1115, 1106,
     1116, 1117, 1119, 1120,  928, 1059, 1041, 1042, 1122, 1150,
     1107, 1125, 1114,  897,  931, 1108, 1084,  931, 1109, 1110,
     1111,  872, 1112,  931, 1113, 1118, 1115, 1165, 1116, 1117,
     1119, 1120, 1123, 1065, 1066,  531, 1166, 1122, 1150, 1125,
     1114, 1092, 1068,  995,  996, 1126, 1075, 1127, 1127, 1076,
     1127, 1128, 1129, 1130,  561, 1003, 1132,  561, 1003, 1130,
     1130, 1130, 1130, 1130, 1130, 1004, 1081,  955, 1004, 1081,
     1082,  928,  942, 1082, 1141,  942, 1133, 1133, 1133,  928,

     1142,  942,  928, 1143, 1132,  480, 1144, 1082, 1145, 1146,
     1082, 1134, 1134, 1134, 1147, 1088, 1148,  971,  971,  971,
      480, 1155, 1141, 1149, 1151, 1152, 1153, 1154, 1142,  955,
     1156, 1143, 1157, 1158, 1144, 1159, 1145, 1146, 1160,  724,
     1161, 1162, 1147, 1004, 1148, 1163, 1004, 1164, 1167,  928,
     1155, 1149, 1151, 1152, 1153, 1154,  634,  928, 1156,  634,
      928, 1157, 1158, 1159, 1123, 1065, 1066, 1160, 1161, 1162,
     1168, 1129, 1169, 1182, 1163, 1164,  647, 1167, 1174,  647,
     1003, 1169, 1130, 1169, 1170, 1171, 1172, 1172, 1172, 1172,
     1004, 1003, 1172, 1172, 1172, 1181, 1175, 1175, 1175, 1183,

     1184, 1004, 1182, 1185,  928,  480, 1174,  928, 1186, 1176,
     1176, 1176,  928, 1088, 1031, 1031, 1031, 1187,  480, 1188,
      706, 1189, 1191, 1181, 1192, 1193, 1194, 1183, 1184, 1195,
     1196, 1185,  971,  971,  971, 1197, 1186,  971,  971,  971,
      971,  971,  971, 1198, 1199, 1207, 1187, 1188, 1004, 1189,
     1191, 1200, 1192, 1193, 1194, 1165,  834, 1195, 1196, 1004,
      924,  829,  928, 1197, 1166,  928, 1202, 1171, 1203,  829,
      928, 1198, 1234, 1199, 1207,  819, 1003, 1215, 1217, 1200,
     1203, 1172, 1203, 1204, 1205, 1206, 1004, 1206, 1206, 1206,
     1003, 1206, 1206, 1206, 1218, 1208, 1208, 1208, 1219,  819,

     1004, 1234, 1220,  928,  480, 1215, 1217,  928, 1209, 1209,
     1209,  928, 1088, 1210, 1210, 1210,  829,  480, 1031, 1031,
     1031, 1221, 1218, 1031, 1031, 1031, 1219, 1031, 1031, 1031,
     1220,  971,  971,  971,  971,  971,  971,  918, 1222, 1223,
     1224,  909, 1225, 1226, 1004, 1227, 1228,  650,  655, 1221,
      650,  655, 1229, 1205, 1230, 1235, 1235, 1235, 1004,  908,
      444,  928, 1003,  444,  480,  928, 1222, 1223, 1224,  928,
     1225, 1226, 1004, 1227, 1228, 1230, 1206, 1230, 1231, 1232,
     1233, 1233, 1233, 1233,  905, 1003, 1233, 1233, 1233, 1240,
     1241, 1211, 1210, 1210, 1210, 1004, 1242, 1243,  928, 1244,

     1245,  928, 1248, 1236, 1236, 1236,  928, 1088, 1031, 1031,
     1031, 1246,  480, 1031, 1031, 1031, 1247, 1240, 1241,  971,
      971,  971, 1249, 1260, 1242, 1243, 1261, 1244, 1245, 1262,
     1004, 1248, 1250, 1232, 1251, 1251, 1233, 1251,  445, 1246,
      904,  445, 1003, 1263, 1247, 1003, 1252, 1253, 1254,  903,
     1249, 1260, 1004, 1004, 1261, 1004,  928, 1262, 1264,  928,
     1254, 1254, 1254,  788,  928,  597,  928, 1254, 1254, 1254,
     1211, 1263, 1255, 1255, 1255, 1256, 1256, 1256,  597, 1088,
      928,  480,  447, 1275,  480,  447, 1264,  928, 1031, 1031,
     1031,  788, 1265, 1253, 1266, 1266, 1254, 1266, 1267, 1268,

     1269,  460, 1003,  898,  460, 1003, 1269, 1269, 1269, 1276,
     1004, 1275, 1004, 1004,  561, 1004, 1277,  561,  928, 1269,
     1269, 1269,  634,  897,  928,  634,  928, 1270, 1270, 1270,
     1288, 1271, 1271, 1271,  872, 1088,  480, 1276,  928,  928,
      480,  971,  971,  971, 1277,  928, 1278, 1268, 1279, 1279,
     1269, 1279, 1280, 1281, 1282,  829, 1003, 1296, 1288, 1003,
     1282, 1282, 1282, 1282, 1282, 1282, 1004,  753,  647, 1004,
     1004,  647,  928, 1004,  871,  531,  928, 1283, 1283, 1283,
      928,  531,  867,  928,  928, 1296,  480, 1284, 1284, 1284,
      866, 1088, 1031, 1031, 1031,  866,  480,  928, 1289, 1281,

     1290, 1290, 1282, 1290,  864, 1280, 1281, 1282, 1003,  863,
      862, 1003, 1282, 1282, 1282, 1282, 1282, 1282, 1004,  650,
      655, 1004,  650,  655, 1004,  928,  447, 1004,  460,  447,
      928,  460,  928,  447,  861,  928,  447,  634,  928,  724,
      855,  928, 1291, 1291, 1291, 1292, 1292, 1292,  855, 1088,
      634,  480,  706,  634,  480, 1289, 1281, 1290, 1290, 1282,
     1290, 1297, 1297, 1297,  634, 1003, 1173,  634, 1003, 1173,
      480,  706,  846,  834,  829, 1004, 1004,  675, 1004, 1004,
     1298, 1298, 1298,  928, 1088, 1302, 1302, 1302,  668,  480,
      928,  665,  677,  928,  480, 1303, 1303, 1303,  676, 1088,

     1307, 1307, 1307,  822,  480,  819, 1308, 1308, 1308,  480,
     1088, 1311, 1311, 1311,  657,  480,  656, 1312, 1312, 1312,
      480, 1088, 1313, 1313, 1313,  817,  480,  816, 1314, 1314,
     1314,  480, 1088, 1004,  651,  649, 1004,  480, 1315, 1315,
     1315, 1316, 1316, 1316,  646, 1088,  644,  480,  813,  633,
      480, 1317, 1317, 1317, 1318, 1318, 1318,  805, 1088,  804,
      480,  628,  802,  480, 1319, 1319, 1319, 1320, 1320, 1320,
      676, 1088,  795,  480,  794,  793,  480, 1321, 1321, 1321,
     1322, 1322, 1322,  792, 1088,  613,  480,  612,  676,  480,
     1323, 1323, 1323, 1324, 1324, 1324,  597, 1088,  597,  480,

      595,  783,  480, 1325, 1325, 1325, 1326, 1326, 1326,  782,
     1088,  781,  480,  590,  589,  480, 1327, 1327, 1327, 1328,
     1328, 1328,  583, 1088,  758,  480,  564,  562,  480, 1329,
     1329, 1329, 1330, 1330, 1330,  753, 1088,  557,  480,  752,
      751,  480, 1331, 1331, 1331, 1332, 1332, 1332,  548, 1088,
      547,  480,  546,  547,  480, 1333, 1333, 1333, 1334, 1334,
     1334,  750, 1088,  535,  480,  531,  519,  480, 1335, 1335,
     1335, 1336, 1336, 1336,  740, 1088,  739,  480,  738,  738,
      480, 1337, 1337, 1337, 1338, 1338, 1338,  512, 1088,  735,
      480,  734,  506,  480, 1339, 1339, 1339, 1340, 1340, 1340,

      732, 1088,  731,  480,  500,  729,  480, 1341, 1341, 1341,
     1342, 1342, 1342,  728, 1088,  495,  480,  726,  725,  480,
     1343, 1343, 1343, 1344, 1344, 1344,  487, 1088,  724,  480,
      717,  475,  480, 1345, 1345, 1345, 1346, 1346, 1346,  469,
     1088,  706,  480,  464,  698,  480, 1347, 1347, 1347, 1348,
     1348, 1348,  696, 1088,  457,  480,  438,  677,  480, 1349,
     1349, 1349, 1350, 1350, 1350,  676, 1088,  675,  480,  672,
      668,  480, 1351, 1351, 1351, 1352, 1352, 1352,  437, 1088,
      438,  480,  437,  438,  480, 1353, 1353, 1353, 1354, 1354,
     1354,  437, 1088,  660,  480,  438,  437,  480, 1355, 1355,

     1355, 1356, 1356, 1356,  656, 1088,  438,  480,  437,  438,
      480, 1357, 1357, 1357, 1358, 1358, 1358,  437, 1088,  651,
      480,  649,  648,  480, 1359, 1359, 1359, 1360, 1360, 1360,
      437, 1088,  646,  480,  437,  633,  480, 1361, 1361, 1361,
     1362, 1362, 1362,  632, 1088,  628,  480,  627,  624,  480,
     1363, 1363, 1363, 1364, 1364, 1364,  613, 1088,  612,  480,
      603,  597,  480, 1365, 1365, 1365, 1366, 1366, 1366,  564,
     1088,  598,  480,  597,  597,  480, 1367, 1367, 1367, 1368,
     1368, 1368,  597, 1088,  595,  480,  594,  592,  480, 1369,
     1369, 1369, 1370, 1370, 1370,  590, 1088,  589,  480,  583,

      572,  480, 1371, 1371, 1371, 1372, 1372, 1372,  569, 1088,
      438,  480,  437,  438,  480, 1373, 1373, 1373, 1374, 1374,
     1374,  437, 1088,  564,  480,  437,  557,  480, 1375, 1375,
     1375, 1376, 1376, 1376,  553, 1088,  549,  480,  548,  547,
      480, 1377, 1377, 1377, 1378, 1378, 1378,  546, 1088,  531,
      480,  531,  531,  480, 1379, 1379, 1379, 1380, 1380, 1380,
      531, 1088,  519,  480,  518,  515,  480, 1381, 1381, 1381,
     1382, 1382, 1382,  512, 1088,  510,  480,  506,  504,  480,
     1383, 1383, 1383, 1384, 1384, 1384,  500, 1088,  499,  480,
      495,  493,  480, 1385, 1385, 1385, 1386, 1386, 1386,  478,

     1088,  437,  480,  477,  475,  480, 1387, 1387, 1387, 1388,
     1388, 1388,  473, 1088,  469,  480,  468,  467,  480, 1389,
     1389, 1389, 1390, 1390, 1390,  464, 1088,  437,  480,  457,
      437,  480, 1391, 1391, 1391, 1392, 1392, 1392,  446, 1088,
      437,  480,  438,  437,  480, 1393, 1393, 1393, 1394, 1394,
     1394, 1443, 1088, 1443,  480, 1443, 1443,  480, 1395, 1395,
     1395, 1396, 1396, 1396, 1443, 1088, 1443,  480, 1443, 1443,
      480, 1397, 1397, 1397, 1398, 1398, 1398, 1443, 1088, 1443,
      480, 1443, 1443,  480, 1399, 1399, 1399, 1400, 1400, 1400,
     1443, 1088, 1443,  480, 1443, 1443,  480, 1401, 1401, 1401,

     1402, 1402, 1402, 1443, 1088, 1443,  480, 1443, 1443,  480,
     1403, 1403, 1403, 1404, 1404, 1404, 1443, 1088, 1443,  480,
     1443, 1443,  480, 1405, 1405, 1405, 1406, 1406, 1406, 1443,
     1088, 1443,  480, 1443, 1443,  480, 1407, 1407, 1407, 1408,
     1408, 1408, 1443, 1088, 1443,  480, 1443, 1443,  480, 1409,
     1409, 1409, 1410, 1410, 1410, 1443, 1088, 1443,  480, 1443,
     1443,  480, 1411, 1411, 1411, 1412, 1412, 1412, 1443, 1088,
     1443,  480, 1443, 1443,  480, 1413, 1413, 1413, 1414, 1414,
     1414, 1443, 1088, 1443,  480, 1443, 1443,  480, 1415, 1415,
     1415, 1416, 1416, 1416, 1443, 1088, 1443,  480, 1443, 1443,

      480, 1417, 1417, 1417, 1418, 1418, 1418, 1443, 1088, 1443,
      480, 1443, 1443,  480, 1419, 1419, 1419, 1420, 1420, 1420,
     1443, 1088, 1443,  480, 1443, 1443,  480, 1421, 1421, 1421,
     1422, 1422, 1422, 1443, 1088, 1443,  480, 1443, 1443,  480,
     1423, 1423, 1423, 1424, 1424, 1424, 1443, 1088, 1443,  480,
     1443, 1443,  480, 1425, 1425, 1425, 1426, 1426, 1426, 1443,
     1088, 1443,  480, 1443, 1443,  480, 1427, 1427, 1427, 1428,
     1428, 1428, 1443, 1088, 1443,  480, 1443, 1443,  480, 1429,
     1429, 1429, 1430, 1430, 1430, 1443, 1088, 1443,  480, 1443,
     1443,  480, 1431, 1431, 1431, 1432, 1432, 1432, 1443, 1088,

     1443,  480, 1443, 1443,  480, 1433, 1433, 1433, 1434, 1434,
     1434, 1443, 1088, 1443,  480, 1443, 1443,  480, 1435, 1435,
     1435, 1436, 1436, 1436, 1443, 1088, 1443,  480, 1443, 1443,
      480, 1437, 1437, 1437, 1443, 1088, 1443, 1438, 1438, 1438,
      480, 1088, 1443, 1439, 1439, 1439,  480, 1088, 1443, 1440,
     1440, 1440,  480, 1088, 1443, 1441, 1441, 1441,  480, 1088,
     1443, 1442, 1442, 1442,  480, 1088, 1443, 1442, 1442, 1442,
      480, 1088,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,  128,  128,  128,  128,  128,  128,  128,

      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  138,  138,  138,  138,  138,
      138,  138,  138,  138,  138,  166,  166,  166,  166,  166,
      166,  166,  166,  166,  166,  166,  166,  166,  166,  166,
      166,  166,  166,  166,  166,  166,  174,  174,  174,  174,
      174,  174,  174,  174,  174,  174,  174,  174,  174,  174,
      174,  174,  174,  174,  174,  174,  174,  180,  180,  180,
      180,  180,  180,  180,  180,  180,  180,  180,  180,  180,
      180,  180,  180,  180,  180,  180,  180,  180,  188,  188,

      188,  188,  188,  188,  188,  188,  188,  188,  188,  188,
      188,  188,  188,  188,  188,  188,  188,  188,  188,  196,
      196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
      196,  196,  196,  196,  196,  196,  196,  196,  196,  196,
      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
      205,  214,  214,  214,  214,  214,  214,  214,  214,  214,
      214,  214,  214,  214,  214,  214,  214,  214,  214,  214,
      214,  214,  248,  248,  248,  248,  248,  248,  248,  248,
      248,  248,  248,  248,  248,  248,  248,  248,  248,  248,

      248,  248,  248,  256,  256,  256,  256,  256,  256,  256,
      256,  256,  256,  256,  256,  256,  256,  256,  256,  256,
      256,  256,  256,  256,  266,  266,  266,  266,  266,  266,
      266,  266,  266,  266,  266,  266,  266,  266,  266,  266,
      266,  266,  266,  266,  266,  281,  281,  281,  281,  281,
      281,  281,  281,  281,  281,  281,  281,  281,  281,  281,
      281,  281,  281,  281,  281,  281,  308,  308,  308,  308,
      308,  308,  308,  308,  308,  308,  308,  308,  308,  308,
      308,  308,  308,  308,  308,  308,  308,  317,  317,  317,
      317,  317,  317,  317,  317,  317,  317,  317,  317,  317,

      317,  317,  317,  317,  317,  317,  317,  317,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  366,
      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
      366,  366,  366,  366,  366,  366,  366,  366,  366,  366,
      375,  375,  375,  375,  375,  375,  375,  375,  375,  375,
      375,  375,  375,  375,  375,  375,  375,  375,  375,  375,
      375,  386,  386,  386,  386,  386,  386,  386,  386,  386,
      386,  386,  386,  386,  386,  386,  386,  386,  386,  386,
      386,  386,  394,  394,  394,  394,  394,  394,  394,  394,

      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,
      394,  394,  394,  407,  407,  407,  407,  407,  407,  407,
      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
      407,  407,  407,  407,  419,  419,  419,  419,  419,  419,
      419,  419,  419,  419,  419,  419,  419,  419,  419,  419,
      419,  419,  419,  419,  419,  425,  425,  425,  425,  425,
      425,  425,  425,  425,  425,  425,  425,  425,  425,  425,
      425,  425,  425,  425,  425,  425,  465,  465,  465, 1443,
      465,  465, 1443,  465,  465, 1443,  465,  465,  465,  465,
     1443,  465,  465,  465,  465,  465,  465,  466,  466,  466,

     1443,  466,  466,  466,  466,  466, 1443,  466,  466,  466,
      466,  466,  466,  466,  466,  466,  466,  466,  470,  470,
      470, 1443,  470,  470, 1443,  470,  470,  470,  470,  470,
      470,  470,  470,  470,  470,  470,  470, 1443,  470,  474,
      474,  474, 1443,  474,  474,  474,  474,  474,  474,  474,
      474,  474,  474,  474,  474,  474,  474,  474,  474,  474,
      476,  476,  476, 1443,  476,  476,  476,  476,  476,  476,
      476,  476,  476,  476,  476,  476,  476,  476,  476,  476,
      476,  481,  481,  481, 1443, 1443, 1443, 1443, 1443,  481,
     1443, 1443, 1443, 1443,  481, 1443, 1443,  481,  486,  486,

      486,  486,  486,  486,  486,  486,  486,  486,  486,  486,
      486,  486,  486,  486,  486,  486,  486,  486,  486,  490,
      490,  490, 1443, 1443,  490, 1443,  490,  490,  490,  490,
      490,  490,  490,  490,  490,  490,  490,  490, 1443,  490,
      494,  494,  494, 1443,  494,  494,  494,  494,  494,  494,
      494,  494,  494,  494,  494,  494,  494,  494,  494,  494,
      494,  496,  496,  496, 1443, 1443,  496, 1443,  496,  496,
      496,  496,  496,  496,  496,  496,  496,  496,  496,  496,
      496,  496,  501,  501,  501, 1443, 1443,  501,  501,  501,
      501, 1443,  501,  501,  501,  501,  501,  501,  501,  501,

      501, 1443,  501,  505,  505,  505, 1443,  505,  505,  505,
      505,  505,  505,  505,  505,  505,  505,  505,  505,  505,
      505,  505,  505,  505,  507,  507,  507, 1443, 1443,  507,
     1443,  507,  507,  507,  507,  507,  507,  507,  507,  507,
      507,  507,  507, 1443,  507,  511,  511,  511, 1443,  511,
      511,  511,  511,  511,  511,  511,  511,  511,  511,  511,
      511,  511,  511,  511,  511,  511,  513,  513,  513,  513,
      513,  513,  513,  513,  513,  513,  513, 1443,  513,  513,
      513,  513,  513,  513,  513,  513,  513,  514,  514, 1443,
      514,  514,  514,  514,  514,  514,  514, 1443, 1443,  514,

      514,  514,  514,  514,  514,  514, 1443,  514,  520,  520,
      520, 1443,  520,  520,  520,  520,  520,  520,  520,  520,
      520,  520,  520,  520,  520,  520,  520,  520,  520,  528,
     1443, 1443, 1443, 1443, 1443, 1443, 1443,  528, 1443, 1443,
     1443, 1443,  528, 1443, 1443,  528,  530,  530,  530,  530,
      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
      530,  530,  530,  530,  530, 1443,  530,  541,  541, 1443,
     1443, 1443, 1443, 1443, 1443,  541, 1443, 1443, 1443, 1443,
      541, 1443, 1443,  541,  541,  552, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443,  552, 1443,  552, 1443,

     1443,  552,  565,  565,  565,  565,  565,  565,  565,  565,
      565,  565,  565,  565,  565,  565,  565,  565,  565,  565,
      565,  565,  565,  568, 1443,  568, 1443,  568,  568,  568,
      568,  568,  568,  568,  568, 1443,  568, 1443,  568,  568,
     1443,  568,  591,  591,  591, 1443,  591,  591,  591,  591,
      591,  591,  591,  591, 1443,  591,  591,  591,  591,  591,
      591,  591,  591,  596,  596,  596, 1443,  596,  596,  596,
      596,  596,  596,  596,  596, 1443,  596,  596,  596,  596,
      596, 1443,  596,  596,  614,  614,  614, 1443,  614,  614,
      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,

      614, 1443,  614, 1443,  614,  615,  615,  615, 1443,  615,
      615,  615,  615,  615,  615,  615,  615,  615,  615, 1443,
      615,  615, 1443,  615, 1443,  615,  616, 1443,  616, 1443,
      616,  616,  616,  616,  616,  616,  616,  616,  616,  616,
      616,  616,  616, 1443,  616, 1443,  616,  623, 1443,  623,
     1443,  623,  623,  623,  623,  623,  623,  623,  623, 1443,
      623,  623,  623,  623,  623,  623,  623,  623,  629, 1443,
      629, 1443,  629,  629,  629,  629,  629,  629,  629,  629,
      629,  629,  629,  629,  629,  629,  629,  629,  629,  654,
      654,  654, 1443,  654,  654,  654,  654,  654,  654,  654,

      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
      659,  659,  659, 1443,  659,  659,  659,  659,  659, 1443,
      659,  659,  659,  659,  659,  659,  659,  659,  659,  659,
      659,  664,  664,  664,  664,  664,  664,  664,  664,  664,
      664,  664,  664,  664,  664,  664,  664,  664,  664,  664,
      664,  664,  667, 1443, 1443,  667, 1443, 1443,  667, 1443,
      667,  667, 1443,  667, 1443,  667, 1443, 1443,  667,  669,
      669,  669, 1443,  669, 1443,  669,  669,  669,  669,  669,
      669, 1443,  669, 1443,  669,  669, 1443,  669, 1443,  669,
      695,  695,  695, 1443,  695,  695,  695,  695,  695,  695,

      695,  695,  695,  695,  695,  695,  695,  695,  695,  695,
      695,  697,  697,  697, 1443,  697,  697,  697,  697,  697,
      697,  697,  697,  697,  697,  697,  697,  697,  697,  697,
      697,  697,  465,  465,  465, 1443,  465,  465, 1443,  465,
      465, 1443,  465,  465,  465,  465, 1443,  465,  465,  465,
      465,  465,  465,  705,  705,  705, 1443,  705,  705,  705,
      705,  705,  705,  705,  705,  705,  705,  705,  705,  705,
      705,  705, 1443,  705,  707,  707,  707, 1443,  707,  707,
      707,  707,  707,  707,  707,  707,  707,  707,  707,  707,
      707,  707,  707,  707,  707,  470,  470,  470, 1443,  470,

      470, 1443,  470,  470,  470,  470,  470,  470,  470,  470,
      470,  470,  470,  470, 1443,  470,  710,  710,  710, 1443,
      710,  710,  710,  710,  710,  710,  710,  710,  710,  710,
      710,  710,  710,  710,  710,  710,  710,  713,  713,  713,
     1443,  713,  713,  713,  713,  713,  713,  713,  713,  713,
      713,  713,  713,  713,  713,  713,  713,  713,  718,  718,
      718, 1443,  718,  718,  718,  718,  718,  718,  718,  718,
      718,  718,  718,  718,  718,  718,  718,  718,  718,  481,
      481,  481, 1443, 1443, 1443, 1443, 1443,  481, 1443, 1443,
     1443, 1443,  481, 1443, 1443,  481,  723,  723, 1443,  723,

      723,  723,  723,  723,  723,  723,  723, 1443,  723,  723,
      723,  723,  723,  723,  723, 1443,  723,  490,  490,  490,
     1443, 1443,  490, 1443,  490,  490,  490,  490,  490,  490,
      490,  490,  490,  490,  490,  490, 1443,  490,  496,  496,
      496, 1443, 1443,  496, 1443,  496,  496,  496,  496,  496,
      496,  496,  496,  496,  496,  496,  496,  496,  496,  501,
      501,  501, 1443, 1443,  501,  501,  501,  501, 1443,  501,
      501,  501,  501,  501,  501,  501,  501,  501, 1443,  501,
      507,  507,  507, 1443, 1443,  507, 1443,  507,  507,  507,
      507,  507,  507,  507,  507,  507,  507,  507,  507, 1443,

      507,  513,  513,  513,  513,  513,  513,  513,  513,  513,
      513,  513, 1443,  513,  513,  513,  513,  513,  513,  513,
      513,  513,  737,  737, 1443,  737,  737,  737,  737,  737,
      737,  737, 1443, 1443,  737,  737,  737,  737,  737,  737,
      737, 1443,  737,  520,  520,  520, 1443,  520,  520,  520,
      520,  520,  520,  520,  520,  520,  520,  520,  520,  520,
      520,  520,  520,  520,  528, 1443, 1443, 1443, 1443, 1443,
     1443, 1443,  528, 1443, 1443, 1443, 1443,  528, 1443, 1443,
      528,  530,  530,  530,  530,  530,  530,  530,  530,  530,
      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,

     1443,  530,  541,  541, 1443, 1443, 1443, 1443, 1443, 1443,
      541, 1443, 1443, 1443, 1443,  541, 1443, 1443,  541,  541,
      552, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443,  552, 1443,  552, 1443, 1443,  552,  565,  565,  565,
      565,  565,  565,  565,  565,  565,  565,  565,  565,  565,
      565,  565,  565,  565,  565,  565,  565,  565,  568, 1443,
      568, 1443,  568,  568,  568,  568,  568,  568,  568,  568,
     1443,  568, 1443,  568,  568, 1443,  568,  591,  591,  591,
     1443,  591,  591,  591,  591,  591,  591,  591,  591, 1443,
      591,  591,  591,  591,  591,  591,  591,  591,  596,  596,

      596, 1443,  596,  596,  596,  596,  596,  596,  596,  596,
     1443,  596,  596,  596,  596,  596, 1443,  596,  596,  614,
      614,  614, 1443,  614,  614,  614,  614,  614,  614,  614,
      614,  614,  614,  614,  614,  614, 1443,  614, 1443,  614,
      615,  615,  615, 1443,  615,  615,  615,  615,  615,  615,
      615,  615,  615,  615, 1443,  615,  615, 1443,  615, 1443,
      615,  616, 1443,  616, 1443,  616,  616,  616,  616,  616,
      616,  616,  616,  616,  616,  616,  616,  616, 1443,  616,
     1443,  616,  623, 1443,  623, 1443,  623,  623,  623,  623,
      623,  623,  623,  623, 1443,  623,  623,  623,  623,  623,

      623,  623,  623,  629, 1443,  629, 1443,  629,  629,  629,
      629,  629,  629,  629,  629,  629,  629,  629,  629,  629,
      629,  629,  629,  629,  818,  818,  818, 1443,  818,  818,
      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
      818,  818,  818, 1443,  818,  820,  820,  820, 1443,  820,
      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
      820,  820,  820,  820,  820,  820,  667, 1443, 1443,  667,
     1443, 1443,  667, 1443,  667,  667, 1443,  667, 1443,  667,
     1443, 1443,  667,  669,  669,  669, 1443,  669, 1443,  669,
      669,  669,  669,  669,  669, 1443,  669, 1443,  669,  669,

     1443,  669, 1443,  669,  830,  830,  830, 1443,  830,  830,
      830,  830,  830,  830,  830,  830,  830,  830,  830,  830,
      830,  830,  830,  830,  830,  833,  833,  833, 1443,  833,
      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
      833,  833,  833,  833,  833,  833,  695,  695,  695, 1443,
      695,  695,  695,  695,  695,  695,  695,  695,  695,  695,
      695,  695,  695,  695,  695,  695,  695,  697,  697,  697,
     1443,  697,  697,  697,  697,  697,  697,  697,  697,  697,
      697,  697,  697,  697,  697,  697,  697,  697,  851,  851,
      851, 1443,  851,  851,  851,  851,  851,  851,  851,  851,

      851,  851,  851,  851,  851,  851,  851, 1443,  851,  465,
      465,  465, 1443,  465,  465, 1443,  465,  465, 1443,  465,
      465,  465,  465, 1443,  465,  465,  465,  465,  465,  465,
      710,  710,  710, 1443,  710,  710,  710,  710,  710,  710,
      710,  710,  710,  710,  710,  710,  710,  710,  710,  710,
      710,  711,  711,  711, 1443,  711,  711,  711,  711,  711,
      711,  711,  711,  711,  711,  711,  711,  711,  711,  711,
      711,  711,  713,  713,  713, 1443,  713,  713,  713,  713,
      713,  713,  713,  713,  713,  713,  713,  713,  713,  713,
      713,  713,  713,  714,  714,  714, 1443,  714,  714,  714,

      714,  714,  714,  714,  714,  714,  714,  714,  714,  714,
      714,  714,  714,  714,  470,  470,  470, 1443,  470,  470,
     1443,  470,  470,  470,  470,  470,  470,  470,  470,  470,
      470,  470,  470, 1443,  470,  481,  481,  481, 1443, 1443,
     1443, 1443, 1443,  481, 1443, 1443, 1443, 1443,  481, 1443,
     1443,  481,  860,  860, 1443,  860,  860,  860,  860,  860,
      860,  860,  860, 1443,  860,  860,  860,  860,  860,  860,
      860, 1443,  860,  490,  490,  490, 1443, 1443,  490, 1443,
      490,  490,  490,  490,  490,  490,  490,  490,  490,  490,
      490,  490, 1443,  490,  496,  496,  496, 1443, 1443,  496,

     1443,  496,  496,  496,  496,  496,  496,  496,  496,  496,
      496,  496,  496,  496,  496,  501,  501,  501, 1443, 1443,
      501,  501,  501,  501, 1443,  501,  501,  501,  501,  501,
      501,  501,  501,  501, 1443,  501,  507,  507,  507, 1443,
     1443,  507, 1443,  507,  507,  507,  507,  507,  507,  507,
      507,  507,  507,  507,  507, 1443,  507,  865,  865, 1443,
      865,  865,  865,  865,  865,  865,  865, 1443, 1443,  865,
      865,  865,  865,  865,  865,  865, 1443,  865,  513,  513,
      513,  513,  513,  513,  513,  513,  513,  513,  513, 1443,
      513,  513,  513,  513,  513,  513,  513,  513,  513,  520,

      520,  520, 1443,  520,  520,  520,  520,  520,  520,  520,
      520,  520,  520,  520,  520,  520,  520,  520,  520,  520,
      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
      530,  530,  530,  530,  530,  530,  530,  530,  530, 1443,
      530,  568, 1443,  568, 1443,  568,  568,  568,  568,  568,
      568,  568,  568, 1443,  568, 1443,  568,  568, 1443,  568,
      591,  591,  591, 1443,  591,  591,  591,  591,  591,  591,
      591,  591, 1443,  591,  591,  591,  591,  591,  591,  591,
      591,  596,  596,  596, 1443,  596,  596,  596,  596,  596,
      596,  596,  596, 1443,  596,  596,  596,  596,  596, 1443,

      596,  596,  616, 1443,  616, 1443,  616,  616,  616,  616,
      616,  616,  616,  616,  616,  616,  616,  616,  616, 1443,
      616, 1443,  616,  614,  614,  614, 1443,  614,  614,  614,
      614,  614,  614,  614,  614,  614,  614,  614,  614,  614,
     1443,  614, 1443,  614,  623, 1443,  623, 1443,  623,  623,
      623,  623,  623,  623,  623,  623, 1443,  623,  623,  623,
      623,  623,  623,  623,  623,  629, 1443,  629, 1443,  629,
      629,  629,  629,  629,  629,  629,  629,  629,  629,  629,
      629,  629,  629,  629,  629,  629,  919,  919,  919, 1443,
      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,

      919,  919,  919,  919,  919, 1443,  919,  669,  669,  669,
     1443,  669, 1443,  669,  669,  669,  669,  669,  669, 1443,
      669, 1443,  669,  669, 1443,  669, 1443,  669,  830,  830,
      830, 1443,  830,  830,  830,  830,  830,  830,  830,  830,
      830,  830,  830,  830,  830,  830,  830,  830,  830,  923,
      923,  923, 1443,  923,  923,  923,  923,  923,  923,  923,
      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
      833,  833,  833, 1443,  833,  833,  833,  833,  833,  833,
      833,  833,  833,  833,  833,  833,  833,  833,  833,  833,
      833,  695,  695,  695, 1443,  695,  695,  695,  695,  695,

      695,  695,  695,  695,  695,  695,  695,  695,  695,  695,
      695,  695,  460, 1443, 1443,  460, 1443, 1443, 1443, 1443,
      460, 1443, 1443, 1443, 1443,  460, 1443, 1443,  460,  947,
      947,  947, 1443,  947,  947,  947,  947,  947,  947,  947,
      947,  947,  947,  947,  947,  947,  947,  947, 1443,  947,
      710,  710,  710, 1443,  710,  710,  710,  710,  710,  710,
      710,  710,  710,  710,  710,  710,  710,  710,  710,  710,
      710,  481,  481,  481, 1443, 1443, 1443, 1443, 1443,  481,
     1443, 1443, 1443, 1443,  481, 1443, 1443,  481,  953,  953,
     1443,  953,  953,  953,  953,  953,  953,  953,  953, 1443,

      953,  953,  953,  953,  953,  953,  953, 1443,  953,  490,
      490,  490, 1443, 1443,  490, 1443,  490,  490,  490,  490,
      490,  490,  490,  490,  490,  490,  490,  490, 1443,  490,
      496,  496,  496, 1443, 1443,  496, 1443,  496,  496,  496,
      496,  496,  496,  496,  496,  496,  496,  496,  496,  496,
      496,  501,  501,  501, 1443, 1443,  501,  501,  501,  501,
     1443,  501,  501,  501,  501,  501,  501,  501,  501,  501,
     1443,  501,  507,  507,  507, 1443, 1443,  507, 1443,  507,
      507,  507,  507,  507,  507,  507,  507,  507,  507,  507,
      507, 1443,  507,  954,  954, 1443,  954,  954,  954,  954,

      954,  954,  954, 1443, 1443,  954,  954,  954,  954,  954,
      954,  954, 1443,  954,  513,  513,  513,  513,  513,  513,
      513,  513,  513,  513,  513, 1443,  513,  513,  513,  513,
      513,  513,  513,  513,  513,  520,  520,  520, 1443,  520,
      520,  520,  520,  520,  520,  520,  520,  520,  520,  520,
      520,  520,  520,  520,  520,  520,  530,  530,  530,  530,
      530,  530,  530,  530,  530,  530,  530,  530,  530,  530,
      530,  530,  530,  530,  530, 1443,  530,  568, 1443,  568,
     1443,  568,  568,  568,  568,  568,  568,  568,  568,  568,
      568, 1443,  568,  568, 1443,  568,  616, 1443,  616, 1443,

      616,  616,  616,  616,  616,  616,  616,  616,  616,  616,
      616,  616,  616, 1443,  616, 1443,  616,  629, 1443,  629,
     1443,  629,  629,  629,  629,  629,  629,  629,  629,  629,
      629,  629,  629,  629,  629,  629,  629,  629,  997,  997,
      997, 1443,  997,  997,  997,  997,  997,  997,  997,  997,
      997,  997,  997,  997,  997,  997,  997, 1443,  997,  923,
      923,  923, 1443,  923,  923,  923,  923,  923,  923,  923,
      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
     1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000,
     1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000,

     1000, 1025, 1025, 1443, 1025, 1025, 1025, 1025, 1025, 1025,
     1025, 1025, 1443, 1025, 1025, 1025, 1025, 1025, 1025, 1025,
     1443, 1025, 1026, 1026, 1443, 1026, 1026, 1026, 1026, 1026,
     1026, 1026, 1443, 1443, 1026, 1026, 1026, 1026, 1026, 1026,
     1026, 1443, 1026, 1089, 1089, 1443, 1089, 1089, 1089, 1089,
     1089, 1089, 1089, 1089, 1443, 1089, 1089, 1089, 1089, 1089,
     1089, 1089, 1443, 1089, 1090, 1090, 1443, 1090, 1090, 1090,
     1090, 1090, 1090, 1090, 1443, 1443, 1090, 1090, 1090, 1090,
     1090, 1090, 1090, 1443, 1090, 1102, 1102, 1102, 1102, 1102,
     1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,

     1102, 1102, 1102, 1102, 1102, 1102, 1131, 1443, 1443, 1443,
     1131, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1131, 1443, 1131, 1135, 1135, 1135, 1135, 1135, 1135, 1443,
     1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
     1135, 1135, 1135, 1135, 1136, 1136, 1443, 1136, 1136, 1136,
     1136, 1136, 1136, 1136, 1136, 1443, 1136, 1136, 1136, 1136,
     1136, 1136, 1136, 1443, 1136, 1137, 1137, 1443, 1137, 1137,
     1137, 1137, 1137, 1137, 1137, 1443, 1443, 1137, 1137, 1137,
     1137, 1137, 1137, 1137, 1443, 1137, 1139, 1139, 1139, 1139,
     1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,

     1139, 1139, 1139, 1139, 1139, 1139, 1139, 1178, 1178, 1443,
     1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1443, 1178,
     1178, 1178, 1178, 1178, 1178, 1178, 1443, 1178, 1179, 1179,
     1443, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1443, 1443,
     1179, 1179, 1179, 1179, 1179, 1179, 1179, 1443, 1179, 1190,
     1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
     1190, 1190, 1190, 1190, 1443, 1190, 1190, 1443, 1190, 1190,
     1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201,
     1201, 1201, 1201, 1201, 1201, 1443, 1201, 1201, 1443, 1201,
     1201, 1212, 1212, 1443, 1212, 1212, 1212, 1212, 1212, 1212,

     1212, 1212, 1443, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
     1443, 1212, 1213, 1213, 1443, 1213, 1213, 1213, 1213, 1213,
     1213, 1213, 1443, 1443, 1213, 1213, 1213, 1213, 1213, 1213,
     1213, 1443, 1213, 1216, 1216, 1216, 1216, 1216, 1216, 1216,
     1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1443, 1216,
     1216, 1443, 1216, 1216, 1237, 1237, 1443, 1237, 1237, 1237,
     1237, 1237, 1237, 1237, 1237, 1443, 1237, 1237, 1237, 1237,
     1237, 1237, 1237, 1443, 1237, 1238, 1238, 1443, 1238, 1238,
     1238, 1238, 1238, 1238, 1238, 1443, 1443, 1238, 1238, 1238,
     1238, 1238, 1238, 1238, 1443, 1238, 1257, 1257, 1443, 1257,

     1257, 1257, 1257, 1257, 1257, 1257, 1257, 1443, 1257, 1257,
     1257, 1257, 1257, 1257, 1257, 1443, 1257, 1258, 1258, 1443,
     1258, 1258, 1258, 1258, 1258, 1258, 1258, 1443, 1443, 1258,
     1258, 1258, 1258, 1258, 1258, 1258, 1443, 1258, 1272, 1272,
     1443, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1443,
     1272, 1272, 1272, 1272, 1272, 1272, 1272, 1443, 1272, 1273,
     1273, 1443, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1443,
     1443, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1443, 1273,
     1285, 1285, 1443, 1285, 1285, 1285, 1285, 1285, 1285, 1285,
     1285, 1443, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1443,

     1285, 1286, 1286, 1443, 1286, 1286, 1286, 1286, 1286, 1286,
     1286, 1443, 1443, 1286, 1286, 1286, 1286, 1286, 1286, 1286,
     1443, 1286, 1293, 1293, 1443, 1293, 1293, 1293, 1293, 1293,
     1293, 1293, 1293, 1443, 1293, 1293, 1293, 1293, 1293, 1293,
     1293, 1443, 1293, 1294, 1294, 1443, 1294, 1294, 1294, 1294,
     1294, 1294, 1294, 1443, 1443, 1294, 1294, 1294, 1294, 1294,
     1294, 1294, 1443, 1294, 1299, 1299, 1443, 1299, 1299, 1299,
     1299, 1299, 1299, 1299, 1299, 1443, 1299, 1299, 1299, 1299,
     1299, 1299, 1299, 1443, 1299, 1300, 1300, 1443, 1300, 1300,
     1300, 1300, 1300, 1300, 1300, 1443, 1443, 1300, 1300, 1300,

     1300, 1300, 1300, 1300, 1443, 1300, 1304, 1304, 1443, 1304,
     1304, 1304, 1304, 1304, 1304, 1304, 1304, 1443, 1304, 1304,
     1304, 1304, 1304, 1304, 1304, 1443, 1304, 1305, 1305, 1443,
     1305, 1305, 1305, 1305, 1305, 1305, 1305, 1443, 1443, 1305,
     1305, 1305, 1305, 1305, 1305, 1305, 1443, 1305, 1309, 1309,
     1443, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1443,
     1309, 1309, 1309, 1309, 1309, 1309, 1309, 1443, 1309,   81,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443
    } ;

static const flex_int16_t yy_chk[8557] =
    {   0,
        0,    1,    0,    1,    1,    2,    0,    2,    2,    3,
      205,    3,    3,  212,   86,   96,  106,    1,   86,   96,
      106,    2,  212,  121,  134,    3,    1,  121,  134,  205,
        2,  206,  110,  125,    3,  112,  161,  161,  207,  111,
      109,  111,  112,  112,  114,  113,  124,  142,  124,  153,
      206,  142,  230,  153,  156,  156,  156,  207,  220,  220,
      219,  110,  125,  156,  112,  896,  230,  111,  109,  111,
      112,  112,  114,  113,  124,  169,  124,  176,  183,  169,
      225,  176,  183,  219,    1,    1,   98,   98,    2,    2,
      225,  896,    3,    3,    4,    4,    4,    4,    4,    4,

        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,

        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
        5,    5,    5,    5,    5,    5,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,

        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    9,  221,    9,    9, 1435,    9, 1309,  235,
       10,    9,   10,   10,  235,   10,  308,  191,    9,   10,
       11,  191,   11,   11,  210,   11,   10,    9,   12,  258,
       12,   12,  308,   12,  258,   10,   11,  201,  158,  158,
      158,  201,  211,  210,   12,   11,  209,  158,  159,  159,

      159,  208,  159,   12,  218,  241,  252,  159,  208,  241,
      252,  211,  208,  262,  218,  209,  209,  262,  218,  296,
      208,  271,   11,  245,  245,  271,  303,  303,  286,  311,
       12,  158,  286,  221,  302,    9,    9,  312,  302,  350,
      350,  312,  316,   10,   10,  311,  296,  532,  322,  391,
      391,  210,  322,   11,   11,  303,  303,  532,  316,  158,
     1306,   12,   12,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,

       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
       13,   13,   13,   13,   13,   13,   13,   13,   13,   15,
     1305,   15,   15,   16,   15,   16,   16,   17,   16,   17,
       17,   18,   17,   18,   18,   15,   18,  213, 1304,   16,
      157,  157,  157,   17,   15, 1301,  213,   18,   16,  157,
      298,  298,   17,  164,  164,  164,   18,   19,  232,   19,
       19,   20,  164,   20,   20,  329,   19,  315,  520,  329,

       20,   15,  232,   19,  313,   16,   21,   20,   21,   21,
      340,   21,   19,  315,  223,  223,   20,  520,  157,  710,
      313,  295,   21,  223,  337,  295,  224,  224,  337,  313,
      298,   21,   15,   15, 1300,  224,   16,   16,  340,   19,
       17,   17,  533,   20,   18,   18,  157,   22,  213,   22,
       22,   23,   22,   23,   23,  341,  533,   24,   21,   24,
       24,  295,   23,   22,  164,  223,  710,   23,   24,  232,
       19,   19,   22,   24,   20,   20,   23,  224,   25,  315,
       25,   25,   24,   25,  341,   29,  342,   29,   29,   21,
       21,  343,  537,   26,   25,   26,   26,  345,   26,   22,

      346,   29,   25,   25,  160,  160,  160,  224,  347,   26,
       29,  348,  560,  160,  342,  349,  314,   26,   26,  314,
      343,  314,  160,  357,  560,  370,  345,  357,  346,  370,
       22,   22,  414,  414,   23,   23,  347,   29,  448,  348,
       24,   24,  314,  349,  449,  379,  453,  160,  314,  379,
      314,  389,  402,  412,  421,  389,  402,  412,  421,  430,
     1299,   25,   25,  430,  442,  442, 1295,  448,   29,   29,
      467,  467,  537,  449,  453,  160,   26,   26,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,

       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
       27,   27,   27,   27,   30,  277,   30,   30,  432,  451,
      454,  450,  437,  432,  445,  455,  277,  437,  437,  437,
       30,  450,  437,  445,  437,  456,  461,  544,  462,   30,
      437,  437,  437,  550,  432,  472,  461,  544,  451,  454,

      450,  526,  432,  477,  455,  574,  472,  550,  555,  450,
      526,  477,  477,  555,  456,  461,   30,  462,  575,  277,
      468, 1294,  522,  559,  461,  468,  468,  468,  528,  522,
      468,  559,  468,  574,  479,  479,  479,  528,  468,  468,
      468,  522,  472,  479, 1293,  277,  575,   30,   30,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,

       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,

       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,

       35,   35,   35,   35,   35,   35,   35,   37, 1287,   37,
       37,   38,   38,   38,   38,  660,  660,   38,   39,  304,
       39,   39,   40,   37,   40,   40,   41,   38,   41,   41,
      304,  552,   37,  278,   39,  305,   38,   42,   40,   42,
       42,  576,   41,   39,  278,  552,  305,   40,  278,  471,
      305,   41,   43,   42,   43,   43,  471, 1286,   45, 1285,
       45,   45,   42,   46,   43,   46,   46,  525,   43,  576,
       45,  446, 1274,  304,   45,   46,  444,   43,   43,   46,
      446,  523,  578,   45,  577,  444,  525,  278,   46,  305,
       37,   37,  523,  579,   38,   38,  471,  538,  538,  304,

      523,   39,   39,  566,   43,   40,   40,   43,  566,   41,
       41,  578,  577,  278,  538,  305,  481,  481,  481,  570,
       42,   42,  579,  570,  599,  481,  606, 1468,  580,   51,
     1468,   51,   51,   43,  529,   43,   43,   44,   44,   44,
       44,   45,   45,  529,  525,   51,   46,   46,  582,   44,
      713,  581,  446,   44,   51,   51,  580,  444,  444,  473,
      599,  602,   44,   44,  473,  473,  473, 1273,  605,  473,
      715,  473,  606,  620,  614,  620,  582,  473,  473,  473,
      581,   51,  483,  483,  483,  635,  483,  638,  493,   44,
      614,  483,   44,  493,  493,  493,  605,  713,  493,  606,

      493,  670,  620,  796,  620,  624,  493,  493,  493,  670,
      624,  602,   51,   51,  635,  529,  638,  715,   44,  796,
       44,   44,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,
       47,   47,   47,   47,   47,   47,   47,   47,   47,   47,

       47,   47,   47,   47,   47,   47,   47,   47,   49,  621,
       49,   49, 1469,  673,   52, 1469,   52,   52, 1272,   53,
       49,   53,   53,  452,   49,  622,  452,  482,  482,  482,
       52,   53,  452,   49,   49,   53,  482,  621,  679,   52,
       52,  622,  673,   54,   53,   54,   54,  679,   55,  636,
       55,   55,  452,  671,   56,   54,   56,   56,  681,   54,
       49, 1259,  452,   49,   55,  671,   52,  681,   54,  584,
       56,  585,  482,   55, 1258,  463, 1257,  636,  463,   56,
      584,  452,  585,   63,  463,   63,   63,  743,   63,   49,
      452,   49,   49,   50,   50,   50,   50,   52,   52,   63,

      482, 1239,   53,   53,  463,   50,  743,  622,   63,   50,
      499, 1238,  541,  541,  463,  499,  499,  499,   50,   50,
      499,  541,  499,  584, 1237,  585,   54,   54,  499,  499,
      499,   55,   55,  463,  504,   63,  637,   56,   56,  504,
      504,  504,  463,  639,  504,   50,  504,  640,   50,  584,
      510,  585,  504,  504,  504,  510,  510,  510,  680,  680,
      510, 1214,  510,  541,  637, 1213,   63,   63,  510,  510,
      510,  639,  830,  830,   50,  640,   50,   50,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,

       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   57,   57,   57,   57,   57,   57,
       57,   57,   57,   57,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,

       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,

       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   61,   61,   61,   61,
       61,   61,   61,   61,   61,   61,   64,  554,   64,   64,
       65,   64,   65,   65,   66,  684,   66,   66,  685,   65,
      686,  554,   64,   66,  642,  643,   65, 1003, 1003,  674,
       66,   64,  683,  691, 1212,   65,  518,  692,  687,   66,
      744,  518,  518,  518,  684,  689,  518,  685,  518,  686,
      690,  693,  642,  643,  518,  518,  518,  674,   64,  744,
      683,  691,   65,  524,  524,  692,   66,  687,  524,  524,

      524, 1072, 1072,  524,  689,  524,  708,  746,  720,  690,
      693,  524,  524,  524,  708,  708,  720,  720,  554,   64,
       64,  746, 1470,   65,   65, 1470, 1180,   66,   66,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,

       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
       67,   67,   67,   67,   67,   69, 1179,   69,   69,   70,
      588,   70,   70,   71, 1178,   71,   71,  694,   71,  543,
      543,   69,   71,   71,   71,   70,  611,  760,  543,   71,
       69,  750,  780,  699,   70,  489,  489,  489,   71,   71,
       72, 1139,   72,   72,  489,   72,  694,  761,  700,   72,
       72,   72,  701,  703,  704,  760,   72,   69,  485,  485,
      485,   70,  699,  762,  588,   72,   72,  485,  712,   73,
      543,   73,   73,  750,   73,  761,  607,  700,   73,  712,
      611,  701,  703,  704,  608,   73,  780,  607,   69,   69,

      588,  762,   70,   70,   73,  608,   71,   71,  763,  765,
      543,  485,   74,  742,   74,   74,  611,   74,  721,  721,
      721,   74,  780, 1138,  742,  712,  489,  721,   74, 1137,
      800,   73,  742,   72,   72,  800,  766,   74,  765,  485,
      607,  768,   79,  764,   79,   79,   79,  767,  608,  749,
      749,  749,  763,  769,   79,  772, 1136,   80,   79,   80,
       80,   80,   73,   73,   74,  766,  607,   79,   79,   80,
      768,  764,  868,   80,  608,  767,  722,  722,  722,  770,
      763,  769,   80,   80,  772,  722,  902,  773, 1135,  770,
      774,  868, 1102, 1093,   79,   74,   74,   75,   75,  771,

       75,   75,  775,   75,   75,   75,  722,   75,  770,   80,
       75,   75,  902,  776,   75,  773,  771,  770,  774,   75,
       75,   75,   75,   75,   75,   79,   79,  572,  771,  777,
      775, 1092,  572,  572,  572,  722,  787,  572,  789,  572,
       80,   80,  776,  778,  771,  572,  572,  572,  791,   75,
       75,   75,  534,   75,  534,  814, 1091,  777,  809,  534,
      534,  534,  812,  828,  534,  787,  534,  789,  811,  895,
      798,  778,  534,  534,  534,  799,  836,   75,   75,   75,
      895,   75,   75,   76,   76,  814,   76,   76,  810,   76,
       76,   76,  828,   76,  854, 1090,   76,   76,  798,  809,

       76, 1089,  791,  799,  836,   76,   76,   76,   76,   76,
       76,  594,  811,  835,  814,  812,  594,  594,  594,  842,
     1077,  594,  810,  594,  821,  839, 1067,  809,  791,  594,
      594,  594,  821,  821,  619,   76,   76,   76,  619,   76,
      811,  854,  835,  619,  619,  619,  837,  842,  619,  837,
      619,  810,  853,  936,  839,  837,  619,  619,  619, 1066,
      853,  853,  936,   76,   76,   76, 1060,   76,   76,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,

       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,  273,  840,  841,  273,  273,
      273,  901,  843,  273,  627,  844, 1039,  273,  273,  627,
      627,  627,  901,  273,  627,  845,  627,  273,  273, 1029,
     1027,  273,  627,  627,  627,  840,  841,  273,  273,  273,
      843,  847,  273,  844,  847,  273,  273,  887,  887,  887,

      847,  273, 1026, 1025,  845,  273,  273,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  573,  573,  573,  573, 1471,  573,  600,

     1471, 1020,  573,  573,  600,  600,  600,  878,  573,  600,
      779,  600,  573,  573,  875,  790,  877,  600,  600,  600,
      857,  779,  573,  573,  573,  573,  790,  573,  857,  857,
      573,  573,  632,  808, 1019,  878,  573,  632,  632,  632,
      573,  573,  632,  875,  632,  877, 1493,  600,  672, 1009,
      632,  632,  632,  672,  672,  672, 1000, 1493,  672,  808,
      672,  832,  832,  832,  779, 1000,  672,  672,  672,  790,
      858,  858,  858,  808,  834,  834,  834,  848,  879,  858,
      848,  832,  849,  998,  850,  849,  848,  850,  808,  873,
      779,  849,  874,  850,  834,  790,  880,  881,  997,  873,

      882,  808,  883,  859,  859,  859,  879,  884, 1004,  874,
      889,  848,  859,  849,  885,  850,  886, 1004,  873,  888,
      890,  874,  891,  892,  880, 1014,  881,  873,  882,  996,
      883,  917,  917,  917, 1014,  990,  884,  874,  889,  832,
      848,  989,  849,  885,  850,  886,  859,  961,  888,  890,
      891,  892,  834,  838,  838,  838,  838,  838,  838,  838,
      838,  838,  838,  838,  838,  838,  838,  838,  838,  838,
      838,  893, 1016,  894,  859,  838,  838,  838,  838,  838,
      838, 1016,  906,  907,  921,  910,  911,  912,  913,  838,
      914,  916,  921,  921,  922,  929,  930,  925,  925,  925,

      893,  894,  926,  926,  926,  838,  838,  838,  933,  838,
      906,  955,  907,  910,  911,  912,  913,  925,  838,  914,
      916,  943,  926,  922,  929,  930,  924,  924,  924,  938,
      927,  927,  927,  838,  838,  838,  924,  934,  838,  899,
      899,  937,  933,  939,  899,  940,  924,  954,  899,  899,
      927,  962,  956,  945,  899,  943,  945,  938,  899,  899,
      953,  950,  945,  957,  958,  948,  934,  964,  899,  899,
      937,  933,  939,  899,  940,  925,  899,  899,  960,  962,
      926,  956,  899,  947,  943,  946,  899,  899,  946,  951,
      951,  951,  957,  958,  946,  964,  944, 1079,  951,  944,

      959,  959,  959,  941,  924,  944, 1079,  960,  927,  935,
      935,  935,  935,  935,  935,  935,  935,  935,  935,  935,
      935,  935,  935,  935,  935,  935,  935,  944,  952,  952,
      952,  935,  935,  935,  935,  935,  935,  952,  965,  963,
      966,  923,  967,  968,  968,  968,  969,  969,  969,  970,
      971,  971,  971,  972,  973,  974,  944,  975,  976,  977,
      919,  935,  935,  935,  978,  935,  965,  952,  963,  966,
      967,  979,  980,  981,  982,  983,  985,  970,  984,  986,
      988,  972,  973,  974,  991,  975,  976,  993,  977,  935,
      935,  935,  978,  904,  935,  952,  987,  987,  987,  979,

      980,  981,  999,  982,  983,  985,  984,  986,  903,  988,
      992,  992,  992,  991, 1008,  993,  994,  994,  994, 1010,
     1011,  968, 1001, 1001, 1001, 1002, 1002, 1002, 1018, 1017,
      999,  900, 1001, 1017, 1021, 1002, 1005, 1005, 1005, 1006,
     1006, 1006, 1001, 1008,  898, 1002, 1007, 1007, 1007, 1011,
     1017, 1012, 1022, 1010, 1012, 1022, 1005, 1018, 1030, 1006,
     1012, 1022, 1032, 1021, 1033, 1034, 1007, 1023, 1023, 1023,
     1024, 1024, 1024, 1035, 1024, 1037, 1023, 1036, 1038, 1024,
     1043, 1044, 1010, 1028, 1028, 1028, 1030, 1031, 1031, 1031,
     1032, 1045, 1033, 1034, 1040, 1040, 1040, 1042, 1042, 1042,

     1001, 1035, 1046, 1002, 1037, 1036, 1038, 1047, 1043, 1044,
     1048, 1049, 1050, 1051, 1005, 1052, 1056, 1006, 1053, 1045,
     1054, 1055, 1057, 1058, 1007, 1059, 1059, 1059, 1063, 1105,
     1046, 1069, 1052,  897, 1078, 1047, 1084, 1078, 1048, 1049,
     1050,  872, 1051, 1078, 1052, 1056, 1053, 1122, 1054, 1055,
     1057, 1058, 1064, 1064, 1064,  869, 1122, 1063, 1105, 1069,
     1052, 1028, 1068, 1068, 1068, 1070, 1070, 1070, 1071, 1071,
     1071, 1074, 1074, 1074, 1494, 1070, 1084, 1494, 1071, 1075,
     1075, 1075, 1076, 1076, 1076, 1070, 1081,  866, 1071, 1083,
     1081, 1074, 1085, 1083, 1094, 1085, 1086, 1086, 1086, 1075,

     1095, 1085, 1076, 1096, 1084, 1086, 1097, 1081, 1098, 1099,
     1083, 1087, 1087, 1087, 1100, 1087, 1101, 1103, 1103, 1103,
     1087, 1110, 1094, 1104, 1106, 1107, 1108, 1109, 1095,  865,
     1111, 1096, 1112, 1113, 1097, 1115, 1098, 1099, 1116,  860,
     1117, 1118, 1100, 1070, 1101, 1119, 1071, 1120, 1125, 1074,
     1110, 1104, 1106, 1107, 1108, 1109, 1504, 1075, 1111, 1504,
     1076, 1112, 1113, 1115, 1123, 1123, 1123, 1116, 1117, 1118,
     1126, 1126, 1126, 1142, 1119, 1120, 1505, 1125, 1132, 1505,
     1126, 1127, 1127, 1127, 1128, 1128, 1128, 1129, 1129, 1129,
     1126, 1127, 1130, 1130, 1130, 1141, 1133, 1133, 1133, 1143,

     1144, 1127, 1142, 1145, 1128, 1133, 1132, 1129, 1146, 1134,
     1134, 1134, 1130, 1134, 1140, 1140, 1140, 1147, 1134, 1148,
      851, 1149, 1151, 1141, 1152, 1155, 1158, 1143, 1144, 1159,
     1160, 1145, 1153, 1153, 1153, 1161, 1146, 1154, 1154, 1154,
     1156, 1156, 1156, 1162, 1163, 1174, 1147, 1148, 1126, 1149,
     1151, 1164, 1152, 1155, 1158, 1165,  833, 1159, 1160, 1127,
      831,  824, 1128, 1161, 1165, 1129, 1168, 1168, 1168,  822,
     1130, 1162, 1207, 1163, 1174,  820, 1168, 1181, 1183, 1164,
     1169, 1169, 1169, 1170, 1170, 1170, 1168, 1171, 1171, 1171,
     1169, 1172, 1172, 1172, 1184, 1175, 1175, 1175, 1187,  818,

     1169, 1207, 1189, 1170, 1175, 1181, 1183, 1171, 1176, 1176,
     1176, 1172, 1176, 1177, 1177, 1177,  816, 1176, 1185, 1185,
     1185, 1192, 1184, 1186, 1186, 1186, 1187, 1188, 1188, 1188,
     1189, 1191, 1191, 1191, 1193, 1193, 1193,  815, 1194, 1195,
     1196,  807, 1197, 1198, 1168, 1199, 1200, 1506, 1508, 1192,
     1506, 1508, 1202, 1202, 1202, 1208, 1208, 1208, 1169,  804,
     1513, 1170, 1202, 1513, 1208, 1171, 1194, 1195, 1196, 1172,
     1197, 1198, 1202, 1199, 1200, 1203, 1203, 1203, 1204, 1204,
     1204, 1205, 1205, 1205,  794, 1203, 1206, 1206, 1206, 1215,
     1218, 1177, 1210, 1210, 1210, 1203, 1220, 1222, 1204, 1223,

     1224, 1205, 1227, 1209, 1209, 1209, 1206, 1209, 1217, 1217,
     1217, 1225, 1209, 1219, 1219, 1219, 1226, 1215, 1218, 1221,
     1221, 1221, 1228, 1240, 1220, 1222, 1242, 1223, 1224, 1243,
     1202, 1227, 1229, 1229, 1229, 1230, 1230, 1230, 1514, 1225,
      793, 1514, 1229, 1244, 1226, 1230, 1231, 1231, 1231,  792,
     1228, 1240, 1229, 1203, 1242, 1230, 1204, 1243, 1245, 1205,
     1232, 1232, 1232, 1248, 1206,  786, 1231, 1233, 1233, 1233,
     1210, 1244, 1235, 1235, 1235, 1236, 1236, 1236,  785, 1236,
     1232, 1235, 1515, 1260, 1236, 1515, 1245, 1233, 1241, 1241,
     1241, 1248, 1250, 1250, 1250, 1251, 1251, 1251, 1252, 1252,

     1252, 1518, 1250,  782, 1518, 1251, 1253, 1253, 1253, 1262,
     1229, 1260, 1250, 1230, 1539, 1251, 1264, 1539, 1252, 1254,
     1254, 1254, 1549,  781, 1231, 1549, 1253, 1255, 1255, 1255,
     1276, 1256, 1256, 1256,  758, 1256, 1255, 1262, 1232, 1254,
     1256, 1261, 1261, 1261, 1264, 1233, 1265, 1265, 1265, 1266,
     1266, 1266, 1267, 1267, 1267,  755, 1265, 1288, 1276, 1266,
     1268, 1268, 1268, 1269, 1269, 1269, 1265,  753, 1550, 1266,
     1250, 1550, 1267, 1251,  752,  748, 1252, 1270, 1270, 1270,
     1268,  747,  739, 1269, 1253, 1288, 1270, 1271, 1271, 1271,
      738, 1271, 1275, 1275, 1275,  737, 1271, 1254, 1278, 1278,

     1278, 1279, 1279, 1279,  734, 1280, 1280, 1280, 1278,  731,
      728, 1279, 1281, 1281, 1281, 1282, 1282, 1282, 1278, 1551,
     1552, 1279, 1551, 1552, 1265, 1280, 1559, 1266, 1562, 1559,
     1267, 1562, 1281, 1593,  725, 1282, 1593, 1587, 1268,  723,
      719, 1269, 1283, 1283, 1283, 1284, 1284, 1284,  718, 1284,
     1587, 1283,  707, 1587, 1284, 1289, 1289, 1289, 1290, 1290,
     1290, 1291, 1291, 1291, 1611, 1289, 1625, 1611, 1290, 1625,
     1291,  705,  696,  682,  676, 1289, 1278,  675, 1290, 1279,
     1292, 1292, 1292, 1280, 1292, 1297, 1297, 1297,  668, 1292,
     1281,  666,  663, 1282, 1297, 1298, 1298, 1298,  662, 1298,

     1302, 1302, 1302,  661, 1298,  659, 1303, 1303, 1303, 1302,
     1303, 1307, 1307, 1307,  658, 1303,  656, 1308, 1308, 1308,
     1307, 1308, 1311, 1311, 1311,  653, 1308,  652, 1312, 1312,
     1312, 1311, 1312, 1289,  651,  649, 1290, 1312, 1313, 1313,
     1313, 1314, 1314, 1314,  646, 1314,  645, 1313,  641,  633,
     1314, 1315, 1315, 1315, 1316, 1316, 1316,  631, 1316,  630,
     1315,  628,  626, 1316, 1317, 1317, 1317, 1318, 1318, 1318,
      625, 1318,  618, 1317,  617,  613, 1318, 1319, 1319, 1319,
     1320, 1320, 1320,  612, 1320,  610, 1319,  609,  604, 1320,
     1321, 1321, 1321, 1322, 1322, 1322,  597, 1322,  596, 1321,

      595,  593, 1322, 1323, 1323, 1323, 1324, 1324, 1324,  590,
     1324,  589, 1323,  587,  586, 1324, 1325, 1325, 1325, 1326,
     1326, 1326,  583, 1326,  571, 1325,  564,  563, 1326, 1327,
     1327, 1327, 1328, 1328, 1328,  557, 1328,  556, 1327,  551,
      549, 1328, 1329, 1329, 1329, 1330, 1330, 1330,  548, 1330,
      547, 1329,  546,  545, 1330, 1331, 1331, 1331, 1332, 1332,
     1332,  542, 1332,  536, 1331,  530,  519, 1332, 1333, 1333,
     1333, 1334, 1334, 1334,  517, 1334,  516, 1333,  515,  514,
     1334, 1335, 1335, 1335, 1336, 1336, 1336,  512, 1336,  509,
     1335,  508,  506, 1336, 1337, 1337, 1337, 1338, 1338, 1338,

      503, 1338,  502, 1337,  500,  498, 1338, 1339, 1339, 1339,
     1340, 1340, 1340,  497, 1340,  495, 1339,  492,  491, 1340,
     1341, 1341, 1341, 1342, 1342, 1342,  488, 1342,  484, 1341,
      476,  475, 1342, 1343, 1343, 1343, 1344, 1344, 1344,  469,
     1344,  466, 1343,  464,  459, 1344, 1345, 1345, 1345, 1346,
     1346, 1346,  458, 1346,  457, 1345,  438,  436, 1346, 1347,
     1347, 1347, 1348, 1348, 1348,  435, 1348,  433, 1347,  431,
      423, 1348, 1349, 1349, 1349, 1350, 1350, 1350,  422, 1350,
      415, 1349,  413,  405, 1350, 1351, 1351, 1351, 1352, 1352,
     1352,  403, 1352,  399, 1351,  392,  390, 1352, 1353, 1353,

     1353, 1354, 1354, 1354,  385, 1354,  382, 1353,  380,  373,
     1354, 1355, 1355, 1355, 1356, 1356, 1356,  371, 1356,  365,
     1355,  361,  360, 1356, 1357, 1357, 1357, 1358, 1358, 1358,
      358, 1358,  351, 1357,  338,  331, 1358, 1359, 1359, 1359,
     1360, 1360, 1360,  330, 1360,  324, 1359,  323,  321, 1360,
     1361, 1361, 1361, 1362, 1362, 1362,  307, 1362,  306, 1361,
      301,  300, 1362, 1363, 1363, 1363, 1364, 1364, 1364,  299,
     1364,  294, 1363,  293,  291, 1364, 1365, 1365, 1365, 1366,
     1366, 1366,  290, 1366,  288, 1365,  287,  285, 1366, 1367,
     1367, 1367, 1368, 1368, 1368,  280, 1368,  279, 1367,  275,

      272, 1368, 1369, 1369, 1369, 1370, 1370, 1370,  270, 1370,
      264, 1369,  263,  254, 1370, 1371, 1371, 1371, 1372, 1372,
     1372,  253, 1372,  246, 1371,  242,  239, 1372, 1373, 1373,
     1373, 1374, 1374, 1374,  231, 1374,  229, 1373,  228,  227,
     1374, 1375, 1375, 1375, 1376, 1376, 1376,  226, 1376,  222,
     1375,  217,  215, 1376, 1377, 1377, 1377, 1378, 1378, 1378,
      214, 1378,  203, 1377,  202,  200, 1378, 1379, 1379, 1379,
     1380, 1380, 1380,  194, 1380,  192, 1379,  186,  184, 1380,
     1381, 1381, 1381, 1382, 1382, 1382,  178, 1382,  177, 1381,
      172,  170, 1382, 1383, 1383, 1383, 1384, 1384, 1384,  155,

     1384,  154, 1383,  152,  145, 1384, 1385, 1385, 1385, 1386,
     1386, 1386,  143, 1386,  136, 1385,  135,  133, 1386, 1387,
     1387, 1387, 1388, 1388, 1388,  126, 1388,  122, 1387,  115,
      107, 1388, 1389, 1389, 1389, 1390, 1390, 1390,  100, 1390,
       97, 1389,   88,   87, 1390, 1391, 1391, 1391, 1392, 1392,
     1392,   81, 1392,    0, 1391,    0,    0, 1392, 1393, 1393,
     1393, 1394, 1394, 1394,    0, 1394,    0, 1393,    0,    0,
     1394, 1395, 1395, 1395, 1396, 1396, 1396,    0, 1396,    0,
     1395,    0,    0, 1396, 1397, 1397, 1397, 1398, 1398, 1398,
        0, 1398,    0, 1397,    0,    0, 1398, 1399, 1399, 1399,

     1400, 1400, 1400,    0, 1400,    0, 1399,    0,    0, 1400,
     1401, 1401, 1401, 1402, 1402, 1402,    0, 1402,    0, 1401,
        0,    0, 1402, 1403, 1403, 1403, 1404, 1404, 1404,    0,
     1404,    0, 1403,    0,    0, 1404, 1405, 1405, 1405, 1406,
     1406, 1406,    0, 1406,    0, 1405,    0,    0, 1406, 1407,
     1407, 1407, 1408, 1408, 1408,    0, 1408,    0, 1407,    0,
        0, 1408, 1409, 1409, 1409, 1410, 1410, 1410,    0, 1410,
        0, 1409,    0,    0, 1410, 1411, 1411, 1411, 1412, 1412,
     1412,    0, 1412,    0, 1411,    0,    0, 1412, 1413, 1413,
     1413, 1414, 1414, 1414,    0, 1414,    0, 1413,    0,    0,

     1414, 1415, 1415, 1415, 1416, 1416, 1416,    0, 1416,    0,
     1415,    0,    0, 1416, 1417, 1417, 1417, 1418, 1418, 1418,
        0, 1418,    0, 1417,    0,    0, 1418, 1419, 1419, 1419,
     1420, 1420, 1420,    0, 1420,    0, 1419,    0,    0, 1420,
     1421, 1421, 1421, 1422, 1422, 1422,    0, 1422,    0, 1421,
        0,    0, 1422, 1423, 1423, 1423, 1424, 1424, 1424,    0,
     1424,    0, 1423,    0,    0, 1424, 1425, 1425, 1425, 1426,
     1426, 1426,    0, 1426,    0, 1425,    0,    0, 1426, 1427,
     1427, 1427, 1428, 1428, 1428,    0, 1428,    0, 1427,    0,
        0, 1428, 1429, 1429, 1429, 1430, 1430, 1430,    0, 1430,

        0, 1429,    0,    0, 1430, 1431, 1431, 1431, 1432, 1432,
     1432,    0, 1432,    0, 1431,    0,    0, 1432, 1433, 1433,
     1433, 1434, 1434, 1434,    0, 1434,    0, 1433,    0,    0,
     1434, 1436, 1436, 1436,    0, 1436,    0, 1437, 1437, 1437,
     1436, 1437,    0, 1438, 1438, 1438, 1437, 1438,    0, 1439,
     1439, 1439, 1438, 1439,    0, 1440, 1440, 1440, 1439, 1440,
        0, 1441, 1441, 1441, 1440, 1441,    0, 1442, 1442, 1442,
     1441, 1442, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
     1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
     1444, 1444, 1444, 1445, 1445, 1445, 1445, 1445, 1445, 1445,

     1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445,
     1445, 1445, 1445, 1445, 1446, 1446, 1446, 1446, 1446, 1446,
     1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446,
     1446, 1446, 1446, 1446, 1446, 1447, 1447, 1447, 1447, 1447,
     1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
     1447, 1447, 1447, 1447, 1447, 1447, 1448, 1448, 1448, 1448,
     1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448,
     1448, 1448, 1448, 1448, 1448, 1448, 1448, 1449, 1449, 1449,
     1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449,
     1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1450, 1450,

     1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450,
     1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1451,
     1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451,
     1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451,
     1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452,
     1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452,
     1452, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453,
     1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453,
     1453, 1453, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454,
     1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454,

     1454, 1454, 1454, 1455, 1455, 1455, 1455, 1455, 1455, 1455,
     1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455,
     1455, 1455, 1455, 1455, 1456, 1456, 1456, 1456, 1456, 1456,
     1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456,
     1456, 1456, 1456, 1456, 1456, 1457, 1457, 1457, 1457, 1457,
     1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457,
     1457, 1457, 1457, 1457, 1457, 1457, 1458, 1458, 1458, 1458,
     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1459, 1459, 1459,
     1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459,

     1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1460, 1460,
     1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460,
     1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1461,
     1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
     1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461,
     1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
     1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
     1462, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463,
     1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463,
     1463, 1463, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464,

     1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464,
     1464, 1464, 1464, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
     1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465,
     1465, 1465, 1465, 1465, 1466, 1466, 1466, 1466, 1466, 1466,
     1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466,
     1466, 1466, 1466, 1466, 1466, 1467, 1467, 1467, 1467, 1467,
     1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467,
     1467, 1467, 1467, 1467, 1467, 1467, 1472, 1472, 1472,    0,
     1472, 1472,    0, 1472, 1472,    0, 1472, 1472, 1472, 1472,
        0, 1472, 1472, 1472, 1472, 1472, 1472, 1473, 1473, 1473,

        0, 1473, 1473, 1473, 1473, 1473,    0, 1473, 1473, 1473,
     1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1474, 1474,
     1474,    0, 1474, 1474,    0, 1474, 1474, 1474, 1474, 1474,
     1474, 1474, 1474, 1474, 1474, 1474, 1474,    0, 1474, 1475,
     1475, 1475,    0, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
     1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
     1476, 1476, 1476,    0, 1476, 1476, 1476, 1476, 1476, 1476,
     1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
     1476, 1477, 1477, 1477,    0,    0,    0,    0,    0, 1477,
        0,    0,    0,    0, 1477,    0,    0, 1477, 1478, 1478,

     1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
     1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1479,
     1479, 1479,    0,    0, 1479,    0, 1479, 1479, 1479, 1479,
     1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479,    0, 1479,
     1480, 1480, 1480,    0, 1480, 1480, 1480, 1480, 1480, 1480,
     1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480,
     1480, 1481, 1481, 1481,    0,    0, 1481,    0, 1481, 1481,
     1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
     1481, 1481, 1482, 1482, 1482,    0,    0, 1482, 1482, 1482,
     1482,    0, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,

     1482,    0, 1482, 1483, 1483, 1483,    0, 1483, 1483, 1483,
     1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
     1483, 1483, 1483, 1483, 1484, 1484, 1484,    0,    0, 1484,
        0, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484,
     1484, 1484, 1484,    0, 1484, 1485, 1485, 1485,    0, 1485,
     1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485,
     1485, 1485, 1485, 1485, 1485, 1485, 1486, 1486, 1486, 1486,
     1486, 1486, 1486, 1486, 1486, 1486, 1486,    0, 1486, 1486,
     1486, 1486, 1486, 1486, 1486, 1486, 1486, 1487, 1487,    0,
     1487, 1487, 1487, 1487, 1487, 1487, 1487,    0,    0, 1487,

     1487, 1487, 1487, 1487, 1487, 1487,    0, 1487, 1488, 1488,
     1488,    0, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488,
     1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1489,
        0,    0,    0,    0,    0,    0,    0, 1489,    0,    0,
        0,    0, 1489,    0,    0, 1489, 1490, 1490, 1490, 1490,
     1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490,
     1490, 1490, 1490, 1490, 1490,    0, 1490, 1491, 1491,    0,
        0,    0,    0,    0,    0, 1491,    0,    0,    0,    0,
     1491,    0,    0, 1491, 1491, 1492,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0, 1492,    0, 1492,    0,

        0, 1492, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
     1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
     1495, 1495, 1495, 1496,    0, 1496,    0, 1496, 1496, 1496,
     1496, 1496, 1496, 1496, 1496,    0, 1496,    0, 1496, 1496,
        0, 1496, 1497, 1497, 1497,    0, 1497, 1497, 1497, 1497,
     1497, 1497, 1497, 1497,    0, 1497, 1497, 1497, 1497, 1497,
     1497, 1497, 1497, 1498, 1498, 1498,    0, 1498, 1498, 1498,
     1498, 1498, 1498, 1498, 1498,    0, 1498, 1498, 1498, 1498,
     1498,    0, 1498, 1498, 1499, 1499, 1499,    0, 1499, 1499,
     1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499,

     1499,    0, 1499,    0, 1499, 1500, 1500, 1500,    0, 1500,
     1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500,    0,
     1500, 1500,    0, 1500,    0, 1500, 1501,    0, 1501,    0,
     1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501,
     1501, 1501, 1501,    0, 1501,    0, 1501, 1502,    0, 1502,
        0, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502,    0,
     1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1503,    0,
     1503,    0, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503,
     1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1507,
     1507, 1507,    0, 1507, 1507, 1507, 1507, 1507, 1507, 1507,

     1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507,
     1509, 1509, 1509,    0, 1509, 1509, 1509, 1509, 1509,    0,
     1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509,
     1509, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
     1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510,
     1510, 1510, 1511,    0,    0, 1511,    0,    0, 1511,    0,
     1511, 1511,    0, 1511,    0, 1511,    0,    0, 1511, 1512,
     1512, 1512,    0, 1512,    0, 1512, 1512, 1512, 1512, 1512,
     1512,    0, 1512,    0, 1512, 1512,    0, 1512,    0, 1512,
     1516, 1516, 1516,    0, 1516, 1516, 1516, 1516, 1516, 1516,

     1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
     1516, 1517, 1517, 1517,    0, 1517, 1517, 1517, 1517, 1517,
     1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517,
     1517, 1517, 1519, 1519, 1519,    0, 1519, 1519,    0, 1519,
     1519,    0, 1519, 1519, 1519, 1519,    0, 1519, 1519, 1519,
     1519, 1519, 1519, 1520, 1520, 1520,    0, 1520, 1520, 1520,
     1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520,
     1520, 1520,    0, 1520, 1521, 1521, 1521,    0, 1521, 1521,
     1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
     1521, 1521, 1521, 1521, 1521, 1522, 1522, 1522,    0, 1522,

     1522,    0, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522,
     1522, 1522, 1522, 1522,    0, 1522, 1523, 1523, 1523,    0,
     1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
     1523, 1523, 1523, 1523, 1523, 1523, 1523, 1524, 1524, 1524,
        0, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524,
     1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1525, 1525,
     1525,    0, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525,
     1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1526,
     1526, 1526,    0,    0,    0,    0,    0, 1526,    0,    0,
        0,    0, 1526,    0,    0, 1526, 1527, 1527,    0, 1527,

     1527, 1527, 1527, 1527, 1527, 1527, 1527,    0, 1527, 1527,
     1527, 1527, 1527, 1527, 1527,    0, 1527, 1528, 1528, 1528,
        0,    0, 1528,    0, 1528, 1528, 1528, 1528, 1528, 1528,
     1528, 1528, 1528, 1528, 1528, 1528,    0, 1528, 1529, 1529,
     1529,    0,    0, 1529,    0, 1529, 1529, 1529, 1529, 1529,
     1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1530,
     1530, 1530,    0,    0, 1530, 1530, 1530, 1530,    0, 1530,
     1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,    0, 1530,
     1531, 1531, 1531,    0,    0, 1531,    0, 1531, 1531, 1531,
     1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531,    0,

     1531, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
     1532, 1532,    0, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
     1532, 1532, 1533, 1533,    0, 1533, 1533, 1533, 1533, 1533,
     1533, 1533,    0,    0, 1533, 1533, 1533, 1533, 1533, 1533,
     1533,    0, 1533, 1534, 1534, 1534,    0, 1534, 1534, 1534,
     1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534,
     1534, 1534, 1534, 1534, 1535,    0,    0,    0,    0,    0,
        0,    0, 1535,    0,    0,    0,    0, 1535,    0,    0,
     1535, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
     1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,

        0, 1536, 1537, 1537,    0,    0,    0,    0,    0,    0,
     1537,    0,    0,    0,    0, 1537,    0,    0, 1537, 1537,
     1538,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0, 1538,    0, 1538,    0,    0, 1538, 1540, 1540, 1540,
     1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540,
     1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1541,    0,
     1541,    0, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541,
        0, 1541,    0, 1541, 1541,    0, 1541, 1542, 1542, 1542,
        0, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542,    0,
     1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1543, 1543,

     1543,    0, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543,
        0, 1543, 1543, 1543, 1543, 1543,    0, 1543, 1543, 1544,
     1544, 1544,    0, 1544, 1544, 1544, 1544, 1544, 1544, 1544,
     1544, 1544, 1544, 1544, 1544, 1544,    0, 1544,    0, 1544,
     1545, 1545, 1545,    0, 1545, 1545, 1545, 1545, 1545, 1545,
     1545, 1545, 1545, 1545,    0, 1545, 1545,    0, 1545,    0,
     1545, 1546,    0, 1546,    0, 1546, 1546, 1546, 1546, 1546,
     1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546,    0, 1546,
        0, 1546, 1547,    0, 1547,    0, 1547, 1547, 1547, 1547,
     1547, 1547, 1547, 1547,    0, 1547, 1547, 1547, 1547, 1547,

     1547, 1547, 1547, 1548,    0, 1548,    0, 1548, 1548, 1548,
     1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
     1548, 1548, 1548, 1548, 1553, 1553, 1553,    0, 1553, 1553,
     1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553,
     1553, 1553, 1553,    0, 1553, 1554, 1554, 1554,    0, 1554,
     1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
     1554, 1554, 1554, 1554, 1554, 1554, 1555,    0,    0, 1555,
        0,    0, 1555,    0, 1555, 1555,    0, 1555,    0, 1555,
        0,    0, 1555, 1556, 1556, 1556,    0, 1556,    0, 1556,
     1556, 1556, 1556, 1556, 1556,    0, 1556,    0, 1556, 1556,

        0, 1556,    0, 1556, 1557, 1557, 1557,    0, 1557, 1557,
     1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557,
     1557, 1557, 1557, 1557, 1557, 1558, 1558, 1558,    0, 1558,
     1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
     1558, 1558, 1558, 1558, 1558, 1558, 1560, 1560, 1560,    0,
     1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560,
     1560, 1560, 1560, 1560, 1560, 1560, 1560, 1561, 1561, 1561,
        0, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561,
     1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1563, 1563,
     1563,    0, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563,

     1563, 1563, 1563, 1563, 1563, 1563, 1563,    0, 1563, 1564,
     1564, 1564,    0, 1564, 1564,    0, 1564, 1564,    0, 1564,
     1564, 1564, 1564,    0, 1564, 1564, 1564, 1564, 1564, 1564,
     1565, 1565, 1565,    0, 1565, 1565, 1565, 1565, 1565, 1565,
     1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
     1565, 1566, 1566, 1566,    0, 1566, 1566, 1566, 1566, 1566,
     1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
     1566, 1566, 1567, 1567, 1567,    0, 1567, 1567, 1567, 1567,
     1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567,
     1567, 1567, 1567, 1568, 1568, 1568,    0, 1568, 1568, 1568,

     1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568,
     1568, 1568, 1568, 1568, 1569, 1569, 1569,    0, 1569, 1569,
        0, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569,
     1569, 1569, 1569,    0, 1569, 1570, 1570, 1570,    0,    0,
        0,    0,    0, 1570,    0,    0,    0,    0, 1570,    0,
        0, 1570, 1571, 1571,    0, 1571, 1571, 1571, 1571, 1571,
     1571, 1571, 1571,    0, 1571, 1571, 1571, 1571, 1571, 1571,
     1571,    0, 1571, 1572, 1572, 1572,    0,    0, 1572,    0,
     1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572,
     1572, 1572,    0, 1572, 1573, 1573, 1573,    0,    0, 1573,

        0, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573,
     1573, 1573, 1573, 1573, 1573, 1574, 1574, 1574,    0,    0,
     1574, 1574, 1574, 1574,    0, 1574, 1574, 1574, 1574, 1574,
     1574, 1574, 1574, 1574,    0, 1574, 1575, 1575, 1575,    0,
        0, 1575,    0, 1575, 1575, 1575, 1575, 1575, 1575, 1575,
     1575, 1575, 1575, 1575, 1575,    0, 1575, 1576, 1576,    0,
     1576, 1576, 1576, 1576, 1576, 1576, 1576,    0,    0, 1576,
     1576, 1576, 1576, 1576, 1576, 1576,    0, 1576, 1577, 1577,
     1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577,    0,
     1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1578,

     1578, 1578,    0, 1578, 1578, 1578, 1578, 1578, 1578, 1578,
     1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578,
     1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,
     1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579,    0,
     1579, 1580,    0, 1580,    0, 1580, 1580, 1580, 1580, 1580,
     1580, 1580, 1580,    0, 1580,    0, 1580, 1580,    0, 1580,
     1581, 1581, 1581,    0, 1581, 1581, 1581, 1581, 1581, 1581,
     1581, 1581,    0, 1581, 1581, 1581, 1581, 1581, 1581, 1581,
     1581, 1582, 1582, 1582,    0, 1582, 1582, 1582, 1582, 1582,
     1582, 1582, 1582,    0, 1582, 1582, 1582, 1582, 1582,    0,

     1582, 1582, 1583,    0, 1583,    0, 1583, 1583, 1583, 1583,
     1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583,    0,
     1583,    0, 1583, 1584, 1584, 1584,    0, 1584, 1584, 1584,
     1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
        0, 1584,    0, 1584, 1585,    0, 1585,    0, 1585, 1585,
     1585, 1585, 1585, 1585, 1585, 1585,    0, 1585, 1585, 1585,
     1585, 1585, 1585, 1585, 1585, 1586,    0, 1586,    0, 1586,
     1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586,
     1586, 1586, 1586, 1586, 1586, 1586, 1588, 1588, 1588,    0,
     1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588,

     1588, 1588, 1588, 1588, 1588,    0, 1588, 1589, 1589, 1589,
        0, 1589,    0, 1589, 1589, 1589, 1589, 1589, 1589,    0,
     1589,    0, 1589, 1589,    0, 1589,    0, 1589, 1590, 1590,
     1590,    0, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590,
     1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1591,
     1591, 1591,    0, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
     1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
     1592, 1592, 1592,    0, 1592, 1592, 1592, 1592, 1592, 1592,
     1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
     1592, 1594, 1594, 1594,    0, 1594, 1594, 1594, 1594, 1594,

     1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
     1594, 1594, 1595,    0,    0, 1595,    0,    0,    0,    0,
     1595,    0,    0,    0,    0, 1595,    0,    0, 1595, 1596,
     1596, 1596,    0, 1596, 1596, 1596, 1596, 1596, 1596, 1596,
     1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596,    0, 1596,
     1597, 1597, 1597,    0, 1597, 1597, 1597, 1597, 1597, 1597,
     1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597,
     1597, 1598, 1598, 1598,    0,    0,    0,    0,    0, 1598,
        0,    0,    0,    0, 1598,    0,    0, 1598, 1599, 1599,
        0, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599,    0,

     1599, 1599, 1599, 1599, 1599, 1599, 1599,    0, 1599, 1600,
     1600, 1600,    0,    0, 1600,    0, 1600, 1600, 1600, 1600,
     1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600,    0, 1600,
     1601, 1601, 1601,    0,    0, 1601,    0, 1601, 1601, 1601,
     1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601,
     1601, 1602, 1602, 1602,    0,    0, 1602, 1602, 1602, 1602,
        0, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602,
        0, 1602, 1603, 1603, 1603,    0,    0, 1603,    0, 1603,
     1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603,
     1603,    0, 1603, 1604, 1604,    0, 1604, 1604, 1604, 1604,

     1604, 1604, 1604,    0,    0, 1604, 1604, 1604, 1604, 1604,
     1604, 1604,    0, 1604, 1605, 1605, 1605, 1605, 1605, 1605,
     1605, 1605, 1605, 1605, 1605,    0, 1605, 1605, 1605, 1605,
     1605, 1605, 1605, 1605, 1605, 1606, 1606, 1606,    0, 1606,
     1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606,
     1606, 1606, 1606, 1606, 1606, 1606, 1607, 1607, 1607, 1607,
     1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607,
     1607, 1607, 1607, 1607, 1607,    0, 1607, 1608,    0, 1608,
        0, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608,
     1608,    0, 1608, 1608,    0, 1608, 1609,    0, 1609,    0,

     1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609,
     1609, 1609, 1609,    0, 1609,    0, 1609, 1610,    0, 1610,
        0, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610,
     1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1612, 1612,
     1612,    0, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612,
     1612, 1612, 1612, 1612, 1612, 1612, 1612,    0, 1612, 1613,
     1613, 1613,    0, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
     1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613,
     1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
     1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,

     1614, 1615, 1615,    0, 1615, 1615, 1615, 1615, 1615, 1615,
     1615, 1615,    0, 1615, 1615, 1615, 1615, 1615, 1615, 1615,
        0, 1615, 1616, 1616,    0, 1616, 1616, 1616, 1616, 1616,
     1616, 1616,    0,    0, 1616, 1616, 1616, 1616, 1616, 1616,
     1616,    0, 1616, 1617, 1617,    0, 1617, 1617, 1617, 1617,
     1617, 1617, 1617, 1617,    0, 1617, 1617, 1617, 1617, 1617,
     1617, 1617,    0, 1617, 1618, 1618,    0, 1618, 1618, 1618,
     1618, 1618, 1618, 1618,    0,    0, 1618, 1618, 1618, 1618,
     1618, 1618, 1618,    0, 1618, 1619, 1619, 1619, 1619, 1619,
     1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619,

     1619, 1619, 1619, 1619, 1619, 1619, 1620,    0,    0,    0,
     1620,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     1620,    0, 1620, 1621, 1621, 1621, 1621, 1621, 1621,    0,
     1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621,
     1621, 1621, 1621, 1621, 1622, 1622,    0, 1622, 1622, 1622,
     1622, 1622, 1622, 1622, 1622,    0, 1622, 1622, 1622, 1622,
     1622, 1622, 1622,    0, 1622, 1623, 1623,    0, 1623, 1623,
     1623, 1623, 1623, 1623, 1623,    0,    0, 1623, 1623, 1623,
     1623, 1623, 1623, 1623,    0, 1623, 1624, 1624, 1624, 1624,
     1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,

     1624, 1624, 1624, 1624, 1624, 1624, 1624, 1626, 1626,    0,
     1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626,    0, 1626,
     1626, 1626, 1626, 1626, 1626, 1626,    0, 1626, 1627, 1627,
        0, 1627, 1627, 1627, 1627, 1627, 1627, 1627,    0,    0,
     1627, 1627, 1627, 1627, 1627, 1627, 1627,    0, 1627, 1628,
     1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
     1628, 1628, 1628, 1628,    0, 1628, 1628,    0, 1628, 1628,
     1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629,
     1629, 1629, 1629, 1629, 1629,    0, 1629, 1629,    0, 1629,
     1629, 1630, 1630,    0, 1630, 1630, 1630, 1630, 1630, 1630,

     1630, 1630,    0, 1630, 1630, 1630, 1630, 1630, 1630, 1630,
        0, 1630, 1631, 1631,    0, 1631, 1631, 1631, 1631, 1631,
     1631, 1631,    0,    0, 1631, 1631, 1631, 1631, 1631, 1631,
     1631,    0, 1631, 1632, 1632, 1632, 1632, 1632, 1632, 1632,
     1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632,    0, 1632,
     1632,    0, 1632, 1632, 1633, 1633,    0, 1633, 1633, 1633,
     1633, 1633, 1633, 1633, 1633,    0, 1633, 1633, 1633, 1633,
     1633, 1633, 1633,    0, 1633, 1634, 1634,    0, 1634, 1634,
     1634, 1634, 1634, 1634, 1634,    0,    0, 1634, 1634, 1634,
     1634, 1634, 1634, 1634,    0, 1634, 1635, 1635,    0, 1635,

     1635, 1635, 1635, 1635, 1635, 1635, 1635,    0, 1635, 1635,
     1635, 1635, 1635, 1635, 1635,    0, 1635, 1636, 1636,    0,
     1636, 1636, 1636, 1636, 1636, 1636, 1636,    0,    0, 1636,
     1636, 1636, 1636, 1636, 1636, 1636,    0, 1636, 1637, 1637,
        0, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637,    0,
     1637, 1637, 1637, 1637, 1637, 1637, 1637,    0, 1637, 1638,
     1638,    0, 1638, 1638, 1638, 1638, 1638, 1638, 1638,    0,
        0, 1638, 1638, 1638, 1638, 1638, 1638, 1638,    0, 1638,
     1639, 1639,    0, 1639, 1639, 1639, 1639, 1639, 1639, 1639,
     1639,    0, 1639, 1639, 1639, 1639, 1639, 1639, 1639,    0,

     1639, 1640, 1640,    0, 1640, 1640, 1640, 1640, 1640, 1640,
     1640,    0,    0, 1640, 1640, 1640, 1640, 1640, 1640, 1640,
        0, 1640, 1641, 1641,    0, 1641, 1641, 1641, 1641, 1641,
     1641, 1641, 1641,    0, 1641, 1641, 1641, 1641, 1641, 1641,
     1641,    0, 1641, 1642, 1642,    0, 1642, 1642, 1642, 1642,
     1642, 1642, 1642,    0,    0, 1642, 1642, 1642, 1642, 1642,
     1642, 1642,    0, 1642, 1643, 1643,    0, 1643, 1643, 1643,
     1643, 1643, 1643, 1643, 1643,    0, 1643, 1643, 1643, 1643,
     1643, 1643, 1643,    0, 1643, 1644, 1644,    0, 1644, 1644,
     1644, 1644, 1644, 1644, 1644,    0,    0, 1644, 1644, 1644,

     1644, 1644, 1644, 1644,    0, 1644, 1645, 1645,    0, 1645,
     1645, 1645, 1645, 1645, 1645, 1645, 1645,    0, 1645, 1645,
     1645, 1645, 1645, 1645, 1645,    0, 1645, 1646, 1646,    0,
     1646, 1646, 1646, 1646, 1646, 1646, 1646,    0,    0, 1646,
     1646, 1646, 1646, 1646, 1646, 1646,    0, 1646, 1647, 1647,
        0, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647,    0,
     1647, 1647, 1647, 1647, 1647, 1647, 1647,    0, 1647, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,

     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443,
     1443, 1443, 1443, 1443, 1443, 1443
    } ;

extern int yy_flex_debug;
int yy_flex_debug = 0;

static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
static char *yy_full_match;
static int yy_lp;
static int yy_looking_for_trail_begin = 0;
static int yy_full_lp;
static int *yy_full_state;
#define YY_TRAILING_MASK 0x2000
#define YY_TRAILING_HEAD_MASK 0x4000
#define REJECT \
{ \
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
++(yy_lp); \
goto find_rule; \
}

#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
/*************************************************************************
 *
 * Copyright (c) 2014-2025 Barbara Geller & Ansel Sermersheim
 * Copyright (c) 1997-2014 Dimitri van Heesch
 *
*************************************************************************/

#include <pre.h>

#include <a_define.h>
#include <arguments.h>
#include <condparser.h>
#include <config.h>
#include <constexp.h>
#include <default_args.h>
#include <doxy_globals.h>
#include <entry.h>
#include <membername.h>
#include <message.h>
#include <util.h>

#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QHash>
#include <QRegularExpression>
#include <QStack>
#include <QStringList>
#include <QVector>

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>

// Toggle for some debugging info
// #define DBG_CTX(x) fprintf x
#define DBG_CTX(x) do { } while(0)

struct CondCtx
{
   CondCtx(int line, const QString &id, bool b)
      : lineNr(line), sectionId(id), skip(b)
   {
   }

   int lineNr;
   QString sectionId;
   bool skip;
};

struct FileState {
   FileState(int size) : lineNr(1), curlyCount(0), fileBuf(size),
      oldFileBuf(QString()), oldFileBufPos(0), bufState(nullptr)
   { }

   int       lineNr;
   int       curlyCount;

   QString   fileBuf;
   QString   oldFileBuf;
   int       oldFileBufPos;
   QString   fileName;
   YY_BUFFER_STATE bufState;
};

/** @brief Singleton which manages the defines available while preprocessing files
 */
class DefineManager
{
   // local class used to hold the defines for a single file
   class DefinesPerFile
   {
    public:
      DefinesPerFile() {
      }

      virtual ~DefinesPerFile() {
      }

      /** Adds a define in the context of a file. Will replace an existing define
       *  with the same name (redefinition)
       *  @param def The Define object to add.
       */
      void addDefine(QSharedPointer<A_Define> def) {
         QSharedPointer<A_Define> d = m_defines.value(def->m_name);

         if (d != nullptr) {
            // redefine
            m_defines.remove(d->m_name);
         }

         m_defines.insert(def->m_name, def);
      }

      /** Adds an include file for this file
       *  @param fileName The name of the include file
       */
      void addInclude(const QString &fileName) {
         m_includedFiles.insert(fileName);
      }

      void collectDefines(DefineDict &dict, QSet<QString> &includeStack);

    private:
      DefineDict m_defines;
      QSet<QString> m_includedFiles;
   };

 public:
   friend class DefinesPerFile;

   /** Returns a reference to the singleton */
   static DefineManager &instance() {
      if (theInstance == nullptr) {
         theInstance = new DefineManager;
      }
      return *theInstance;
   }

   static void deleteInstance() {
      delete theInstance;
      theInstance = nullptr;
   }

   /** Starts a context in which defines are collected.
    *  Called at the start of a new file that is preprocessed.
    *  @param fileName the name of the file to process.
    */
   void startContext(const QString &fileName) {
      m_contextDefines.clear();
      if (fileName.isEmpty()) {
         return;
      }

      QSharedPointer<DefinesPerFile> dpf = m_fileMap.value(fileName);

      if (dpf == nullptr) {
         // new file

         m_fileMap.insert(fileName, QMakeShared<DefinesPerFile>());
      }
   }

   /** Ends the context started with startContext() freeing any
    *  defines collected within in this context.
    */
   void endContext() {
      m_contextDefines.clear();
   }

   /** Add an included file to the current context.
    *  If the file has been pre-processed already, all defines are added to the context.
    *  @param fileName The name of the include file to add to the context.
    */
   void addFileToContext(const QString &fileName) {
      if (fileName.isEmpty()) {
         return;
      }

      QSharedPointer<DefinesPerFile> dpf = m_fileMap.value(fileName);

      if (dpf == nullptr) {
         // new file

         m_fileMap.insert(fileName, QMakeShared<DefinesPerFile>());

      } else {
         // existing file

         QSet<QString> includeStack;
         dpf->collectDefines(m_contextDefines, includeStack);
      }
   }

   /** Add a define to the manager object.
    *  @param fileName The file in which the define was found
    *  @param def The Define object to add.
    */
   void addDefine(const QString &fileName, QSharedPointer<A_Define> def) {
      if (fileName.isEmpty()) {
         return;
      }

      QSharedPointer<A_Define> d = m_contextDefines.value(def->m_name);

      if (d != nullptr) {
         // redefine
         m_contextDefines.remove(d->m_name);
      }

      m_contextDefines.insert(def->m_name, def);

      //
      QSharedPointer<DefinesPerFile> dpf = m_fileMap.value(fileName);

      if (dpf == nullptr) {
         dpf = QMakeShared<DefinesPerFile>();
         m_fileMap.insert(fileName, dpf);
      }

      dpf->addDefine(std::move(def));
   }

   /** Add an include relation to the manager object.
    *  @param fromFileName file name in which the include was found.
    *  @param toFileName file name that is included.
    */
   void addInclude(const QString &fromFileName, const QString &toFileName) {
      if (fromFileName.isEmpty() || toFileName.isEmpty()) {
         return;
      }

      QSharedPointer<DefinesPerFile> dpf = m_fileMap.value(fromFileName);

      if (dpf == nullptr) {
         dpf = QMakeShared<DefinesPerFile>();
         m_fileMap.insert(fromFileName, dpf);
      }

      dpf->addInclude(toFileName);
   }

   /** Returns a Define object given its name or 0 if the Define does not exist.
   */
   QSharedPointer<A_Define> isDefined(const QString &name) const {
      QSharedPointer<A_Define> d = m_contextDefines.value(name);

      if (d && d->undef) {
         d = QSharedPointer<A_Define>();
      }

      return d;
   }

   /** Returns a reference to the defines found in the current context. */
   const DefineDict &defineContext() const {
      return m_contextDefines;
   }

 private:
   static DefineManager *theInstance;

   /** Helper function to collect all define for a given file */
   void collectDefinesForFile(const QString &fileName, QSharedPointer<DefineDict> dict) {
      if (fileName.isEmpty()) {
         return;
      }

      QSharedPointer<DefinesPerFile> dpf = m_fileMap.value(fileName);

      if (dpf) {
         QSet<QString> includeStack;
         dpf->collectDefines(*dict, includeStack);
      }
   }

   /** returns the DefinesPerFile object for a given file name. */
   QSharedPointer<DefinesPerFile> find(const QString &fileName) const {
      if (fileName.isEmpty()) {
         return QSharedPointer<DefinesPerFile>();
      }

      return m_fileMap.value(fileName);
   }

   DefineManager() {
   }

   virtual ~DefineManager() {
   }

   QHash<QString, QSharedPointer<DefinesPerFile>> m_fileMap;
   DefineDict m_contextDefines;
};

DefineManager *DefineManager::theInstance = nullptr;

/** Collects all defines for a file and all files that the file includes.
 *  This function will recursively call itself for each file.
 *  @param dict The dictionary to fill with the defines. A redefine will
 *         replace a previous definition.
 *  @param includeStack The stack of includes, used to stop recursion in
 *         case there is a cyclic include dependency.
 */
void DefineManager::DefinesPerFile::collectDefines(DefineDict &dict, QSet<QString> &includeStack)
{
   {
      for (const auto &incFile : m_includedFiles) {
         QSharedPointer<DefinesPerFile> dpf = DefineManager::instance().find(incFile);

         if (dpf != nullptr && ! includeStack.contains(incFile)) {
            includeStack.insert(incFile);
            dpf->collectDefines(dict, includeStack);
         }
      }
   }

   {
      for (const auto &def : m_defines)  {
         QSharedPointer<A_Define> d = dict.value(def->m_name);

         if (d != nullptr) {
            // redefine
            dict.remove(d->m_name);
         }

         dict.insert(def->m_name, def);
      }
   }
}

static QStringList              s_pathList;
static QString                  s_yyFileName;
static QSharedPointer<FileDef>  s_yyFileDef;
static QSharedPointer<FileDef>  s_inputFileDef;

static QSharedPointer<QHash<QString, int>> s_argDict;
static QStack<QSharedPointer<FileState>>   s_includeStack;
static QStack<QSharedPointer<CondCtx>>     s_condStack;
static QSharedPointer<DefineDict>          s_expandedDict;

static int          s_yyLineNr   = 1;
static int          s_yyMLines   = 1;
static int          s_yyColNr    = 1;
static int          s_ifcount    = 0;
static int          s_defArgs    = -1;

static QString      s_defName;
static QString      s_defText;
static QString      s_defLitText;
static QString      s_defArgsStr;
static QString      s_defExtraSpacing;
static bool         s_defVarArgs;

static int          s_lastCContext;
static int          s_lastCPPContext;
static QStack<int>  s_levelGuard;

static QString      s_outputString;
static QString      s_inputString;
static int          s_inputPosition;

static int          s_roundCount;
static bool         s_quoteArg;
static bool         s_idStart;

static int          s_findDefArgContext;
static bool         s_expectGuard;
static QString      s_guardName;
static QString      s_lastGuardName;
static QString      s_incName;
static QString      s_guardExpr;
static int          s_curlyCount;
static bool         s_nospaces;          // add extra spaces during macro expansion

static bool         s_macroExpansion;    // from the configuration
static bool         s_expandOnlyPredef;  // from the configuration
static int          s_commentCount;
static bool         s_insideComment;
static bool         s_isImported;
static QString      s_blockName;
static int          s_condCtx;
static bool         s_skip;

static bool         s_insideCS;          // C# has simpler preprocessor
static bool         s_insideFortran;
static bool         s_isSource;

static bool         s_lexInit   = false;
static int          s_fenceSize = 0;
static bool         s_ccomment;

QString             s_delimiter;

static QSet<QString> s_allIncludes;
static QSet<QString> s_expansionDict;

#define MAX_EXPANSION_DEPTH 50

static void setFileName(const QString &name)
{
   bool ambig;
   QFileInfo fi(name);

   s_yyFileName = fi.absoluteFilePath();
   s_yyFileDef  = findFileDef(&Doxy_Globals::inputNameDict, s_yyFileName, ambig);

   if (s_yyFileDef == nullptr) {
      // if this is not an input file check if it is an include file
      s_yyFileDef = findFileDef(&Doxy_Globals::includeNameDict, s_yyFileName, ambig);
   }

   if (s_yyFileDef && s_yyFileDef->isReference()) {
      s_yyFileDef = QSharedPointer<FileDef>();
   }

   s_insideCS      = getLanguageFromFileName(s_yyFileName) == SrcLangExt_CSharp;
   s_insideFortran = getLanguageFromFileName(s_yyFileName) == SrcLangExt_Fortran;

   s_isSource = determineSection(s_yyFileName);
}

static void incrLevel()
{
   s_levelGuard.push(0);
}

static void decrLevel()
{
   if (s_levelGuard.size() > 0) {
      s_levelGuard.pop();

   } else {
      warn(s_yyFileName, s_yyLineNr, "More #endif's than #if's found\n");

   }
}

static bool otherCaseDone()
{
   if (s_levelGuard.size() == 0) {
      warn(s_yyFileName, s_yyLineNr, "Found an #else without a preceding #if\n");
      return true;

   } else {
      return s_levelGuard.top();

   }
}

static void setCaseDone(bool value)
{
   s_levelGuard.top() = value;
}

static QSharedPointer<FileState> checkAndOpenFile(const QString &fileName, bool &alreadyIncluded)
{
   alreadyIncluded = false;
   QSharedPointer<FileState> fs;

   QFileInfo fi(fileName);

   if (fi.exists() && fi.isFile()) {
      static const QStringList exclPatterns = Config::getList("exclude-patterns");

      if (patternMatch(fi, exclPatterns)) {
         return QSharedPointer<FileState>();
      }

      QString absName = fi.absoluteFilePath();

      // global guard
      if (s_curlyCount == 0) {
         // not #include inside { ... }

         if (s_allIncludes.contains(absName)) {
            alreadyIncluded = true;
            return QSharedPointer<FileState>();
         }

         s_allIncludes.insert(absName);
      }

      // check include stack for absName
      QStack<QSharedPointer<FileState>> tmpStack;

      while (! s_includeStack.isEmpty()) {
         fs = s_includeStack.pop();

         if (fs->fileName == absName) {
            alreadyIncluded = true;
         }

         tmpStack.push(fs);
      }

      while (! tmpStack.isEmpty()) {
         fs = tmpStack.pop();

         s_includeStack.push(fs);
      }

      if (alreadyIncluded) {
         return QSharedPointer<FileState>();
      }

      fs = QMakeShared<FileState>(fi.size() + 4096);
      alreadyIncluded = false;

      if (! readInputFile(absName, fs->fileBuf)) {
         // error
         fs = QSharedPointer<FileState>();

      } else {
         fs->oldFileBuf    = s_inputString;
         fs->oldFileBufPos = s_inputPosition;
      }
   }

   return fs;
}

static QSharedPointer<FileState> findFile(const QString &fileName, bool localInclude, bool &alreadyIncluded)
{
   if (QDir::isAbsolutePath(fileName)) {
      QSharedPointer<FileState> fs = checkAndOpenFile(fileName, alreadyIncluded);

      if (fs) {
         setFileName(fileName);
         s_yyLineNr = 1;
         return fs;

      } else if (alreadyIncluded) {
         return QSharedPointer<FileState>();
      }
   }

   if (localInclude && ! s_yyFileName.isEmpty()) {
      QFileInfo fi(s_yyFileName);

      if (fi.exists()) {
         QString absName = fi.absolutePath() + "/" + fileName;
         QSharedPointer<FileState> fs = checkAndOpenFile(absName, alreadyIncluded);

         if (fs) {
            setFileName(absName);
            s_yyLineNr = 1;
            return fs;

         } else if (alreadyIncluded) {
            return QSharedPointer<FileState>();
         }
      }
   }

   if (s_pathList.isEmpty()) {
      return QSharedPointer<FileState>();
   }

   for (const auto &s : s_pathList) {
      QString absName = s + "/" + fileName;

      QSharedPointer<FileState> fs = checkAndOpenFile(absName, alreadyIncluded);

      if (fs) {
         setFileName(absName);
         s_yyLineNr = 1;
         return fs;

      } else if (alreadyIncluded) {
         return QSharedPointer<FileState>();
      }
   }

   return QSharedPointer<FileState>();
}

static QString extractTrailingComment(const QString &s)
{
   if (s.isEmpty()) {
      return QString();
   }

   int i = s.length() - 1;

   while (i >= 0) {
      QChar c = s[i];

      switch (c.unicode()) {
         case '/': {
            --i;

            if (i >= 0 && s[i] == '*') {
               // end of a comment block
               --i;

               while (i > 0 && !(s[i - 1] == '/' && s[i] == '*')) {
                  i--;
               }

               if (i == 0) {
                  ++i;
               }

               // only /*!< or /**< are treated as a comment for the macro name     */
               // otherwise the comment is treated as part of the macro definition

               return ((s[i + 1] == '*' || s[i + 1] == '!') && s[i + 2] == '<') ? s.mid(i - 1) : "";

            } else {
               return QString();
            }
         }

         break;

         // whitespace or line-continuation
         case ' ':
         case '\t':
         case '\r':
         case '\n':
         case '\\':
            break;

         default:
            return QString();
      }

      --i;
   }

   return QString();
}

static int getNextChar(const QString &expr, QString *rest, uint &pos);
static int getCurrentChar(const QString &expr, QString *rest, uint pos);
static void unputChar(const QString &expr, QString *rest, uint &pos, char c);
static bool expandExpression(QString &expr, QString *rest, int pos, int level);

static QString stringize(const QString &s)
{
   QString result;
   QChar c;
   QChar pc;

   uint i = 0;
   bool inString = false;
   bool inChar   = false;

   while (i < s.length()) {

      if (! inString && ! inChar) {
         while (i < s.length() && ! inString && ! inChar) {
            c = s.at(i++);

            if (c == '"') {
               result += "\\\"";
               inString = true;

            } else if (c == '\'') {
               result += c;
               inChar = true;

            } else {
               result += c;
            }
         }

      } else if (inChar) {
         while (i < s.length() && inChar) {
            c = s.at(i++);

            if (c == '\'') {
               result += '\'';
               inChar = false;

            } else if (c == '\\') {
               result += "\\\\";
            } else {
               result += c;
            }
         }

      } else {
         pc = 0;

         while (i < s.length() && inString) {
            QChar c2 = s.at(i++);

            if (c2 == '"') {
               result += "\\\"";
               inString = pc == '\\';

            } else if (c2 == '\\') {
               result += "\\\\";

            } else {
               result += c2;
            }

            pc = c2;
         }
      }
   }

   return result;
}

static void processConcatOperators(QString &str)
{
   if (str.isEmpty()) {
      return;
   }

   static QRegularExpression regExp("[ \t\r\n]*##[ \t\r\n]*");
   QRegularExpressionMatch match = regExp.match(str);

   int matchLen;
   int pos;

   while (match.hasMatch()) {

      pos      = match.capturedStart() - str.constBegin();
      matchLen = match.capturedLength();

      if (pos + matchLen + 1 < str.length() && str.at(pos + matchLen) == '@' && str.at(pos + matchLen + 1) == '-') {
         // remove no-rescan marker after ID
         matchLen += 2;
      }

      // remove the ## operator and the surrounding whitespace
      str   = str.left(pos) + str.right(str.length() - pos - matchLen);
      int k = pos - 1;

      while (k >= 0 && isId(str.at(k))) {
         --k;
      }

      if (k > 0 && str.at(k) == '-' && str.at(k - 1) == '@') {
         // remove no-rescan marker before ID
         str  = str.left(k - 1) + str.right(str.length() - k - 1);
         pos -= 2;
      }

      match = regExp.match(str, str.constBegin() + pos);
   }
}

static void yyunput (int c,char *buf_ptr);
static void returnCharToStream(char c)
{
  unput(c);
}

static inline void addTillEndOfString(const QString &expr, QString *rest, uint &pos, char term, QString &arg)
{
   int cc;

   while ((cc = getNextChar(expr, rest, pos)) != EOF && cc != 0) {
      if (cc == '\\') {
         arg += (char)cc, cc = getNextChar(expr, rest, pos);
      } else if (cc == term) {
         return;
      }
      arg += (char)cc;
   }
}

/*! replaces the function macro def whose argument list starts at pos in expression \a expr.
 * Notice that this routine may scan beyond the expr string if needed.
 * In that case the characters will be read from the input file.
 * The replacement string will be returned in \a result and the
 * length of the (unexpanded) argument list is stored in \a len.
 */
static bool replaceFunctionMacro(const QString &expr, QString *rest, int pos, int &len,
         QSharedPointer<const A_Define> def, QString &result, int level)
{
   uint j = pos;
   len    = 0;

   result.clear();
   int cc;

   while ((cc = getCurrentChar(expr, rest, j)) != EOF && isspace(cc)) {
      ++len;
      getNextChar(expr, rest, j);
   }

   if (cc != '(') {
      unputChar(expr, rest, j, cc);
      return false;
   }

   // consume the `(' character
   getNextChar(expr, rest, j);

   // list of arguments
   QHash<QString, QString> argTable;

   QString arg;
   int argCount = 0;
   bool done    = false;

   // PHASE 1: read the macro arguments
   if (def->nargs == 0) {
      while ((cc = getNextChar(expr, rest, j)) != EOF && cc != 0) {
         char c = (char)cc;

         if (c == ')') {
            break;
         }
      }

   } else {
      while (! done && (argCount < def->nargs || def->varArgs) &&
             ((cc = getNextChar(expr, rest, j)) != EOF && cc != 0)) {

         char c = (char)cc;

         if (c == '(') {
            // argument is a function => search for matching )
            int roundLevel = 1;
            arg += c;

            //char term='\0';

            while ((cc = getNextChar(expr, rest, j)) != EOF && cc != 0) {
               c = (char)cc;

               if (c == '\'' || c == '\"') {
                  // skip ('s and )'s inside strings
                  arg += c;
                  addTillEndOfString(expr, rest, j, c, arg);
               }

               if (c == ')') {
                  --roundLevel;
                  arg += c;

                  if (roundLevel == 0) {
                     break;
                  }

               } else if (c == '(') {
                  ++roundLevel;
                  arg += c;

               } else {
                  arg += c;
               }
            }

         } else if (c == ')' || c == ',') {
            // last or next argument found

            if (c == ',' && argCount == def->nargs - 1 && def->varArgs) {
               arg = arg.trimmed();
               arg += ',';

            } else {

               QString argKey;
               argKey = QString("@%1").formatArg(argCount++);    // key name
               arg    = arg.trimmed();

               // add argument to the lookup table
               argTable.insert(argKey, arg);
               arg.clear();

               if (c == ')') {
                  // end of the argument list
                  done = true;
               }
            }

         } else if (c == '\"') {
            // append literal strings

            arg += c;
            bool found = false;

            while (!found && (cc = getNextChar(expr, rest, j)) != EOF && cc != 0) {
               found = cc == '"';

               if (cc == '\\') {
                  c = (char)cc;
                  arg += c;
                  if ((cc = getNextChar(expr, rest, j)) == EOF || cc == 0) {
                     break;
                  }
               }
               c = (char)cc;
               arg += c;
            }

         } else if (c == '\'') {
            // append literal characters
            arg += c;
            bool found = false;

            while (! found && (cc = getNextChar(expr, rest, j)) != EOF && cc != 0) {
               found = cc == '\'';

               if (cc == '\\') {
                  c = (char)cc;
                  arg += c;

                  if ((cc = getNextChar(expr, rest, j)) == EOF || cc == 0) {
                     break;
                  }
               }

               c = (char)cc;
               arg += c;
            }

         } else if (c == '/') {
            // possible start of a comment

            char prevChar = '\0';
            arg += c;

            cc = getCurrentChar(expr, rest, j);

            if (cc == '*') {
               // we have a comment

               while ((cc = getNextChar(expr,rest,j)) != EOF && cc != 0) {
                  c    = (char)cc;
                  arg += c;

                  if (c == '/' && prevChar == '*')  {
                     // found an end of comment
                     break;
                  }

                  prevChar = c;
               }
            }

         } else {
            // append other characters
            arg += c;
         }
      }
   }

   // PHASE 2: apply the macro function
   if (argCount == def->nargs || // same number of arguments
         (argCount >= def->nargs - 1 && def->varArgs)) {

         // variadic macro with at least as many
         // params as the non-variadic part (see bug731985)

      uint k = 0;

      // substitution of all formal arguments
      QString resExpr;
      const QString d = def->m_definition.trimmed();

      bool inString = false;

      while (k < d.length()) {
         if (d.at(k) == '@') {
            // maybe a marker, otherwise an escaped @

            if (d.at(k + 1) == '@') {
               // escaped @ => copy it (is unescaped later)

               k += 2;
               resExpr += "@@"; // we unescape these later

            } else if (d.at(k + 1) == '-') {
               // no-rescan marker
               k += 2;
               resExpr += "@-";

            } else {
               // argument marker, read the argument number
               QString key = "@";

               bool hash = false;
               int len2  = k - 1;

               // search for ## backward
               if (len2 >= 0 && d.at(len2) == '\"') {
                  --len2;
               }

               while (len2 >= 0 && d.at(len2) == ' ') {
                  --len2;
               }

               if (len2 > 0 && d.at(len2) == '#' && d.at(len2 - 1) == '#') {
                  hash = true;
               }

               ++k;

               // scan the number
               while (k < d.length() && d.at(k) >= '0' && d.at(k) <= '9') {
                  key += d.at(k++);
               }

               if (! hash) {
                  // search for ## forward
                  len2 = k;

                  if (len2 < d.length() && d.at(len2) == '\"') {
                     ++len2;
                  }

                  while (len2 < d.length() && d.at(len2) == ' ') {
                     ++len2;
                  }

                  if (len2 < d.length() - 1 && d.at(len2) == '#' && d.at(len2 + 1) == '#') {
                     hash = true;
                  }
               }

               if (key.length() > 1 && argTable.contains(key)) {
                  QString substArg = argTable.value(key);

                  // only if no ## operator is before or after the argument marker, then do macro expansion
                  if (! hash) {
                     expandExpression(substArg, nullptr, 0, level + 1);
                  }

                  if (inString) {
                     // if the marker is inside a string (because a # was put
                     // before the macro name), escape " and \ characters
                     resExpr += stringize(substArg);

                  } else {
                     if (hash && substArg.isEmpty()) {
                        // empty argument will be remove later on
                        resExpr += "@E";

                     } else if (s_nospaces) {
                        resExpr += substArg;

                     } else {
                        resExpr += " " + substArg + " ";
                     }
                  }
               }
            }

         } else {
            // no marker, just copy

            if (! inString && d.at(k) == '\"') {
               inString = true; // entering a literal string

            } else if (inString && d.at(k) == '\"' && (d.at(k - 1) != '\\' || d.at(k - 2) == '\\')) {
               inString = false; // leaving a literal string
            }
            resExpr += d.at(k++);
         }
      }

      len    = j - pos;
      result = resExpr;

      return true;
   }

   return false;
}

/*! returns the next identifier in string \a expr by starting at position \a p.
 * The position of the identifier is returned (or -1 if nothing is found)
 * and \a l is its length. Any quoted strings are skipping during the search.
 */
static int getNextId(const QString &expr, int p, int *l)
{
   int n;

   while (p < expr.length()) {
      QChar c = expr.at(p++);

      if (c.isNumber()) {
         // skip number
         while (p < expr.length() && isId(expr.at(p))) {
            ++p;
         }

      } else if (c.isLetter() || c == '_') {
         // read id
         n = p - 1;

         while (p < expr.length() && isId(expr.at(p))) {
            ++p;
         }

         *l = p - n;
         return n;

      } else if (c == '"') {
         // skip string

         QChar ppc = 0;
         QChar pc = c;

         if (p < expr.length()) {
            c = expr.at(p);
         }

         while (p < expr.length() && (c != '"' || (pc == '\\' && ppc != '\\')))
            // continue as long as no " is found, but ignoring \", but not \\"
         {
            ppc = pc;
            pc = c;
            c = expr.at(p);
            ++p;
         }

         if (p < expr.length()) {
            ++p;   // skip closing quote
         }

      } else if (c == '/') { // skip C Comment
         QChar pc = c;

         if (p < expr.length()) {
            c = expr.at(p);

            if (c == '*') { // Start of C comment
               ++p;

               while (p < expr.length() && !(pc == '*' && c == '/')) {
                  pc = c;
                  c = expr.at(p++);
               }
            }
         }

      }
   }

   return -1;
}

/*! performs recursive macro expansion on the string expr starting at position pos
 *  may read additional characters from the input while re-scanning
 *  if expandAll is true then all macros in the expression are expanded, otherwise only the first is expanded
 */
static bool expandExpression(QString &expr, QString *rest, int pos, int level)
{
   if (expr.isEmpty()) {
     return true;
   }

   if (s_expansionDict.contains(expr) && level > MAX_EXPANSION_DEPTH) {
      // check for too deep recursive expansions
      return false;

   } else {
      s_expansionDict.insert(expr);
   }

   QString macroName;
   QString expMacro;

   bool definedTest = false;
   int i = pos;
   int tmpLen;
   int p;
   int len;

   int startPos     = pos;
   int samePosCount = 0;

   while ((p = getNextId(expr, i, &tmpLen)) != -1) {
      // search for an macro name

      bool replaced = false;
      macroName = expr.mid(p, tmpLen);

      if (p < 2 || ! (expr.at(p - 2) == '@' && expr.at(p - 1) == '-')) {
         // no-rescan marker?

         if (! s_expandedDict->contains(macroName)) {

            // expand macro
            QSharedPointer<A_Define> def = DefineManager::instance().isDefined(macroName);

            if (macroName == "defined") {
               definedTest = true;

            } else if (definedTest) {
               // macro name was found after defined

               if (def) {
                  expMacro = " 1 ";
               } else {
                  expMacro = " 0 ";
               }

               replaced    = true;
               len         = tmpLen;
               definedTest = false;

            } else if (def && def->nargs == -1) {
               // simple macro
               // substitute the definition of the macro

               if (s_nospaces) {
                  expMacro = def->m_definition.trimmed();
               } else {
                  expMacro = " " + def->m_definition.trimmed() + " ";
               }

               replaced = true;
               len = tmpLen;

            } else if (def && def->nargs >= 0) {
               // function macro
               replaced = replaceFunctionMacro(expr, rest, p + tmpLen, len, def, expMacro, level);
               len += tmpLen;
            }

            if (replaced) {
               // expand the macro and rescan the expression

               QString resultExpr = expMacro;
               QString restExpr   = expr.right(expr.length() - len - p);

               processConcatOperators(resultExpr);

               bool isExpanded = false;

               if (def && ! def->nonRecursive) {
                  s_expandedDict->insert(macroName, def);
                  isExpanded = expandExpression(resultExpr, &restExpr, 0, level + 1);
                  s_expandedDict->remove(macroName);
               } else if (def && def->nonRecursive) {
                  isExpanded = true;

               }
               if (isExpanded) {
                  expr = expr.left(p) + resultExpr + restExpr;
                  i    = p;

                } else {
                   expr = expr.left(p) + "@-" + expr.right(expr.length()-p);
                   i    = p + tmpLen + 2;
                }

            } else {
               // move to the next macro name
               i = p + tmpLen;
            }

         } else {
            // move to the next macro name
            expr = expr.left(p) + "@-" + expr.right(expr.length() - p);
            i = p + tmpLen + 2;

         }

         // check for too many inplace expansions without making progress
         if (i == startPos) {
           ++samePosCount;

         } else {
           startPos     = i;
           samePosCount = 0;
         }

         if (samePosCount > MAX_EXPANSION_DEPTH) {
           break;
         }

      } else {
         // no re-scan marker found, skip the macro name
         i = p + tmpLen;
      }
   }
  return true;
}

//  inputStr should point to the start of a string or character literal.
// the routine will return a pointer to just after the end of the literal
// the character making up the literal will be added to \a result.

QString::const_iterator processUntilMatch(QString::const_iterator iter_start, QString::const_iterator iter_end,
                  QString &result)
{
   if (iter_start == iter_end) {
      return iter_start;
   }

   // capture start character
   QChar term = *iter_start;

   if (term != '\'' && term != '"') {
      // not a valid literal
      return iter_start;
   }

   QChar ch = term;

   // output start character
   result += ch;
   ++iter_start;

   while (iter_start != iter_end) {
      ch = *iter_start;

      if (ch == term) {
         // found end marker of the literal, output end character and stop

         result += ch;
         ++iter_start;
         break;

      } else if (ch == '\\')  {
         // escaped character, process next character
         // as well without checking for end marker

         result += ch;
         ++iter_start;

         if (iter_start == iter_end) {
            // unexpected end of string after escape character
            break;
         }

         ch = *iter_start;
      }

      result += ch;
      ++iter_start;
   }

   return iter_start;
}

/*! replaces all occurrences of @@@@ in s by @@
 *  and removes all occurrences of @@E
 *  All identifiers found are replaced by 0L
 */
QString removeIdsAndMarkers(const QString &s)
{
   QString::const_iterator iter     = s.constBegin();
   QString::const_iterator iter_end = s.constEnd();

   QString result;

   bool inNum = false;

   while (iter != iter_end) {
      QChar c = *iter;

      // replace @@ with @ and remove @E
      if (c == '@') {

         if (*(iter + 1) == '@') {
            result += c;

         } else if (*(iter + 1) == 'E') {
            // skip
         }

         iter += 2;

      } else if (c.isNumber()) {
         // number

         result += c;
         inNum = true;

         ++iter;

      } else if (c == '\'') {
         iter = processUntilMatch(iter, iter_end, result);

      } else if (c == 'd' && ! inNum) {
         // identifier starting with a `d'

         QStringView tmp = QStringView(iter, iter_end);

         if (tmp.startsWith("defined ") || tmp.startsWith("defined(")) {
            // defined keyword, skip defined
            iter += 7;

         } else {
            result += "0L";
            ++iter;

            while (iter != iter_end) {
               c = *iter;

               if (isId(c)) {
                  ++iter;

               } else {
                  break;
               }
            }
         }

      } else if ((c.isLetter() || c == '_') && ! inNum) {
         // replace identifier with 0L
         result += "0L";
         ++iter;

         while (iter != iter_end) {
            c = *iter;

            if (isId(c)) {
               ++iter;

            } else {
               break;
            }
         }

         while (iter != iter_end) {
            c = *iter;

            if (c.isSpace()) {
               ++iter;

            } else {
               break;
            }
         }

         if (*iter == '(') {
            // undefined function macro
            ++iter;

            int count = 1;

            while (iter != iter_end) {
               c = *iter;
               ++iter;

               if (c == '(') {
                  ++count;

               } else if (c == ')') {
                  --count;

                  if (count == 0) {
                     break;
                  }

               } else if (c == '/') {
                  QChar pc = c;

                  ++iter;
                  c = *iter;

                  if (c == '*') {
                     // start of C comment

                     while (iter != iter_end && ! (pc == '*' && c == '/')) {
                        // search end of comment
                        pc = c;

                        ++iter;
                        c = *iter;
                     }

                     ++iter;
                  }
               }
            }
         }

      } else if (c == '/') {
         // skip C comments
         QChar pc = c;

         ++iter;
         c = *iter;

         if (c == '*') {
            // start of C comment

            while (iter != iter_end && ! (pc == '*' && c == '/')) {
               // search end of comment
               pc = c;

               ++iter;
               c = *iter;
            }

            ++iter;

         } else {
            // not comment but division
            result += pc;
            result += c;

            QChar lc = c.toLower()[0];

            if (! isId(lc) && lc != '.') {
               inNum = false;
            }

            ++iter;
         }

      } else {
         result += c;
         QChar lc = c.toLower()[0];

         if (! isId(lc) && lc != '.') {
            inNum = false;
         }

         ++iter;
      }
   }

   return result;
}

/*! replaces all occurrences of @@ in \a s by @
 *  \par assumption:
 *   \a s only contains pairs of @@'s
 */
QString removeMarkers(const QString &s)
{
   QString::const_iterator iter     = s.constBegin();
   QString::const_iterator iter_end = s.constEnd();
   QString result;

   while (iter != iter_end) {
      QChar c = *iter;

      switch (c.unicode()) {

         case '@': {
            // replace @@ with @

            if (iter + 1 != iter_end && iter[1] ==  '@') {
               result += c;
               ++iter;
            }

            ++iter;
         }
         break;

         case '/': {
            // skip C comments
            result  += c;

            QChar pc = c;
            ++iter;

            if (iter != s.constEnd()) {
               c = *iter;
            }

            if (c == '*') {
               // start of C comment

               while (iter != iter_end  && ! (pc == '*' && c == '/')) {
                  // search end of comment

                  if (*iter == '@' &&  (iter + 1 != iter_end && iter[1] == '@')) {
                     result += c;
                     ++iter;

                  } else {
                     result += c;
                  }

                  pc = c;
                  ++iter;

                  if (iter != iter_end) {
                     c = *iter;
                  }
               }

               if (iter != iter_end) {
                  result += c;
                  ++iter;
               }
            }
         }
         break;

         case '"':
         case '\'':
            // skip string literals and char literals

            iter = processUntilMatch(iter, iter_end, result);
            break;

         default: {
            result += c;
            ++iter;
         }
         break;
      }
   }

   return result;
}

/*! compute the value of the expression in string expr.
 *  If needed the function may read additional characters from the input.
 */
bool computeExpression(const QString &expr)
{
   QString e = expr;

   s_expansionDict.clear();
   expandExpression(e, nullptr, 0, 0);

   e = removeIdsAndMarkers(e);

   if (e.isEmpty()) {
      return false;
   }

   bool retval = parseconstexp(s_yyFileName, s_yyLineNr, e);

   return retval;
}

/*! expands the macro definition in name
 *  If needed the function may read additional characters from the input
 */

QString expandMacro(const QString &name)
{
   QString n = name;

   s_expansionDict.clear();
   expandExpression(n, nullptr, 0, 0);

   n = removeMarkers(n);

   return n;
}

QSharedPointer<A_Define> newDefine()
{
   QSharedPointer<A_Define> def = QMakeShared<A_Define>();

   def->m_name       = s_defName;
   def->m_definition = s_defText.trimmed();
   def->nargs        = s_defArgs;
   def->m_fileName   = s_yyFileName;
   def->fileDef      = s_yyFileDef;
   def->lineNr       = s_yyLineNr - s_yyMLines;
   def->columnNr     = s_yyColNr;
   def->varArgs      = s_defVarArgs;

   if (! def->m_name.isEmpty() && Doxy_Globals::expandAsDefinedDict.contains(def->m_name)) {
      def->isPredefined = true;
   }

   return def;
}

static void addDefine()
{
   if (s_skip) {
      // do not add this define as it is inside a
      // conditional section (cond command) that is disabled

      return;
   }

   QSharedPointer<MemberDef> md = QMakeShared<MemberDef>(s_yyFileName, s_yyLineNr - s_yyMLines, s_yyColNr,
               "#define", s_defName, s_defArgsStr, "", Protection::Public, Specifier::Normal, false,
               Relationship::Member, MemberDefType::Define, ArgumentList(), ArgumentList());

   if (! s_defArgsStr.isEmpty()) {
      ArgumentList argList;

      QString dummy;
      argList = stringToArgumentList(SrcLangExt_Cpp, dummy, s_defArgsStr);

      md->setArgumentList(argList);
   }

   int len = s_defLitText.indexOf('\n');

   if (len > 0 && s_defLitText.left(len).trimmed() == "\\") {
      // strip first line if it only contains a slash
      s_defLitText = s_defLitText.right(s_defLitText.length() - len - 1);

   } else if (len > 0) {
      // align the items on the first line with the items on the second line
      int k = len + 1;

      QString::const_iterator iter = s_defLitText.constBegin() + k;

      while (iter !=  s_defLitText.constEnd())  {
         QChar c = *iter;
         ++iter;

         if (c == ' ' || c == '\t') {
            ++k;

         } else {
            break;

         }
      }

      s_defLitText = s_defLitText.mid(len + 1, k - len - 1) + s_defLitText.trimmed();
   }

   md->setInitializer(s_defLitText.trimmed());
   md->setFileDef(s_inputFileDef);
   md->setDefinition("#define " + s_defName);

   QSharedPointer<MemberName> mn = Doxy_Globals::functionNameSDict.find(s_defName);

   if (! mn) {
      mn = QMakeShared<MemberName>(s_defName);
      Doxy_Globals::functionNameSDict.insert(s_defName, mn);
   }

   mn->append(md);

   if (s_yyFileDef) {
      s_yyFileDef->insertMember(md);
   }
}

static inline void outputChar(QChar c)
{
   if (s_includeStack.isEmpty() || s_curlyCount > 0) {
      s_outputString += c;
   }
}

static inline void outputArray(const QString &a, int len)
{
   if (s_includeStack.isEmpty() || s_curlyCount > 0) {
      s_outputString += a.mid(0, len);
   }
}

static void readIncludeFile(const QString &inc)
{
   static const bool searchIncludes = Config::getBool("search-includes");
   uint i = 0;

   // find the start of the include file name
   while (i < inc.length() && (inc.at(i) == ' ' || inc.at(i) == '"' || inc.at(i) == '<')) {
      ++i;
   }
   uint s = i;

   // was it a local include?
   bool localInclude = s > 0 && inc.at(s - 1) == '"';

   // find the end of the include file name
   while (i < inc.length() && inc.at(i) != '"' && inc.at(i) != '>') {
      ++i;
   }

   if (s < inc.length() && i > s) {
      // valid include file name found

      // extract include path+name
      QString incFileName = inc.mid(s, i - s).trimmed();
      QString dosExt      = incFileName.right(4);

      if (dosExt == ".exe" || dosExt == ".dll" || dosExt == ".tlb") {
         // skip imported binary files (e.g. M$ type libraries)
         return;
      }

      QString oldFileName = s_yyFileName;

      QSharedPointer<FileDef> oldFileDef = s_yyFileDef;
      int oldLineNr = s_yyLineNr;

      // absIncFileName avoids difficulties for incFileName starting with "../"
      QString absIncFileName = incFileName;

      {
         QFileInfo fi1(s_yyFileName);

         if (fi1.exists()) {
            QString absName_1 = fi1.absolutePath() + "/" + incFileName;

            QFileInfo fi2(absName_1);
            if (fi2.exists()) {
               absIncFileName = fi2.absoluteFilePath();

            } else if (searchIncludes) {
               static const QStringList includePath = Config::getList("include-path");

               for (const auto &item : includePath) {
                  QFileInfo fi3(item);

                  if (fi3.exists() && fi3.isDir()) {
                     QString absName_3 = fi3.absoluteFilePath() + "/" + incFileName;

                     QFileInfo fi4(absName_3);
                     if (fi4.exists()) {
                        absIncFileName = fi4.absoluteFilePath();
                        break;
                     }
                  }

               }
            }

         }
      }

      DefineManager::instance().addInclude(s_yyFileName, absIncFileName);
      DefineManager::instance().addFileToContext(absIncFileName);

      // findFile will overwrite s_yyFileDef if found
      QSharedPointer<FileState> fs;
      bool alreadyIncluded = false;

      if ((fs = findFile(incFileName, localInclude, alreadyIncluded))) {
         // see if the include file can be found

         if (oldFileDef) {
            // add include dependency to the file in which the #include was found
            bool ambig;

            // change to absolute name
            QSharedPointer<FileDef> incFd = findFileDef(&Doxy_Globals::inputNameDict, absIncFileName, ambig);

            QSharedPointer<FileDef> temp;
            if (ambig) {
               temp = QSharedPointer<FileDef>();
            } else {
               temp = incFd;
            }

            oldFileDef->addIncludeDependency(temp, incFileName, localInclude, s_isImported, false);

            // add included by dependency
            if (s_yyFileDef) {
               s_yyFileDef->addIncludedByDependency(oldFileDef, oldFileDef->docName(), localInclude, s_isImported);
            }

         } else if (s_inputFileDef) {
            s_inputFileDef->addIncludeDependency(QSharedPointer<FileDef>(), absIncFileName, localInclude, s_isImported, true);

         }

         fs->bufState   = YY_CURRENT_BUFFER;
         fs->lineNr     = oldLineNr;
         fs->fileName   = oldFileName;
         fs->curlyCount = s_curlyCount;

         s_curlyCount   = 0;

         // push the state on the stack
         s_includeStack.push(fs);

         // set the scanner to the include file

         // Deal with file changes due to
         // #include's within { .. } blocks

         QString lineStr = QString("# 1 \"%1\" 1\n").formatArg(QString(s_yyFileName));
         outputArray(lineStr, lineStr.length());

         DBG_CTX((stderr, "Switching to include file %s\n", csPrintable(incFileName)));
         s_expectGuard = true;
         s_inputString    = fs->fileBuf;
         s_inputPosition = 0;

         preYY_switch_to_buffer(preYY_create_buffer(0, YY_BUF_SIZE));

      } else {

         if (oldFileDef) {
            bool ambig;

            // change to absolute name for bug 641336
            QSharedPointer<FileDef> fd = findFileDef(&Doxy_Globals::inputNameDict, absIncFileName, ambig);

            // add include dependency to the file in which the #include was found
            oldFileDef->addIncludeDependency(ambig ? QSharedPointer<FileDef>() : fd, incFileName, localInclude, s_isImported, false);

            // add included by dependency
            if (fd) {
               fd->addIncludedByDependency(oldFileDef, oldFileDef->docName(), localInclude, s_isImported);
            }

         } else if (s_inputFileDef) {
            s_inputFileDef->addIncludeDependency(QSharedPointer<FileDef>(), absIncFileName, localInclude, s_isImported, true);
         }

         if (Debug::isFlagSet(Debug::Preprocessor)) {
            if (alreadyIncluded) {
               Debug::print(Debug::Preprocessor, 0, "#include %s: already included, skipping...\n", csPrintable(incFileName));
            } else {
               Debug::print(Debug::Preprocessor, 0, "#include %s: not found, skipping...\n", csPrintable(incFileName));
            }
         }

         if (s_curlyCount > 0 && !alreadyIncluded) { // failed to find #include inside { ... }
            warn(s_yyFileName, s_yyLineNr, "include file %s was not found, check the value of INCLUDE_PATH", csPrintable(incFileName));
         }
      }
   }
}

static void startCondSection(const QString &sectId)
{
   CondParser prs;

   bool expResult = prs.parse(s_yyFileName, s_yyLineNr, sectId);
   s_condStack.push( QMakeShared<CondCtx>(s_yyLineNr, sectId, s_skip) );

   if (! expResult) {
      s_skip = true;
   }
}

static void endCondSection()
{
   if (s_condStack.isEmpty()) {
      s_skip = false;

   } else {
      QSharedPointer<CondCtx> ctx = s_condStack.pop();
      s_skip = ctx->skip;
   }
}

static void forceEndCondSection()
{
   while (! s_condStack.isEmpty()) {
      s_condStack.pop();
   }

   s_skip = false;
}

static QString escapeAt(const QString &text)
{
   QString result;

   for (auto c : text) {
      if (c == '@') {
         result += "@@";

      } else {
         result += c;
      }
   }

   return result;
}

static char resolveTrigraph(char c)
{
   switch (c) {
      case '=':
         return '#';

      case '/':
         return '\\';

      case '\'':
         return '^';

      case '(':
         return '[';

      case ')':
         return ']';

      case '!':
         return '|';

      case '<':
         return '{';

      case '>':
         return '}';

      case '-':
         return '~';
   }

   return '?';
}

#undef  YY_INPUT
#define YY_INPUT(buf,result,max_size)   result = yyread(buf,max_size);

static int yyread(char *buf, int max_size)
{
   int len = max_size;

   const char *src = s_inputString.constData() + s_inputPosition;

   if (s_inputPosition + len >= s_inputString.size_storage()) {
      len = s_inputString.size_storage() - s_inputPosition;
   }

   memcpy(buf, src, len);
   s_inputPosition += len;

   return len;
}

#define YY_NO_UNISTD_H 1

#define INITIAL 0
#define Start 1
#define Command 2
#define SkipCommand 3
#define SkipLine 4
#define SkipString 5
#define CopyLine 6
#define CopyString 7
#define CopyStringCs 8
#define CopyStringFtn 9
#define CopyStringFtnDouble 10
#define CopyRawString 11
#define Include 12
#define IncludeID 13
#define EndImport 14
#define DefName 15
#define DefineArg 16
#define DefineText 17
#define SkipCPPBlock 18
#define Ifdef 19
#define Ifndef 20
#define SkipCComment 21
#define ArgCopyCComment 22
#define CopyCComment 23
#define SkipVerbatim 24
#define SkipCPPComment 25
#define RemoveCComment 26
#define RemoveCPPComment 27
#define Guard 28
#define DefinedExpr1 29
#define DefinedExpr2 30
#define SkipDoubleQuote 31
#define SkipSingleQuote 32
#define UndefName 33
#define IgnoreLine 34
#define FindDefineArgs 35
#define ReadString 36
#define CondLineC 37
#define CondLineCpp 38
#define SkipCond 39

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif
    
#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

static int yy_init_globals ( void );

/* Accessor methods to globals.
   These are made visible to non-reentrant scanners for convenience. */

int yylex_destroy ( void );

int yyget_debug ( void );

void yyset_debug ( int debug_flag  );

YY_EXTRA_TYPE yyget_extra ( void );

void yyset_extra ( YY_EXTRA_TYPE user_defined  );

FILE *yyget_in ( void );

void yyset_in  ( FILE * _in_str  );

FILE *yyget_out ( void );

void yyset_out  ( FILE * _out_str  );

			int yyget_leng ( void );

char *yyget_text ( void );

int yyget_lineno ( void );

void yyset_lineno ( int _line_number  );

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap ( void );
#else
extern int yywrap ( void );
#endif
#endif

#ifndef YY_NO_UNPUT
    
    static void yyunput ( int c, char *buf_ptr  );
    
#endif

#ifndef yytext_ptr
static void yy_flex_strncpy ( char *, const char *, int );
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen ( const char * );
#endif

#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput ( void );
#else
static int input ( void );
#endif

#endif

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 196608
#endif /* __ia64__ */
#endif

/* Copy whatever the last rule matched to the standard output. */
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
#endif

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		int n; \
		for ( n = 0; n < max_size && \
			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( yyin ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else \
		{ \
		errno=0; \
		while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(yyin); \
			} \
		}\
\

#endif

/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif

/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
#endif

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int yylex (void);

#define YY_DECL int yylex (void)
#endif /* !YY_DECL */

/* Code executed at the beginning of each rule, after yytext and yyleng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK /*LINTED*/break;
#endif

#define YY_RULE_SETUP \
	if ( yyleng > 0 ) \
		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
				(yytext[yyleng - 1] == '\n'); \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	yy_state_type yy_current_state;
	char *yy_cp, *yy_bp;
	int yy_act;
    
	if ( !(yy_init) )
		{
		(yy_init) = 1;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

        /* Create the reject buffer large enough to save one state per allowed character. */
        if ( ! (yy_state_buf) )
            (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE  );
            if ( ! (yy_state_buf) )
                YY_FATAL_ERROR( "out of dynamic memory in yylex()" );

		if ( ! (yy_start) )
			(yy_start) = 1;	/* first start state */

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

		if ( ! YY_CURRENT_BUFFER ) {
			yyensure_buffer_stack ();
			YY_CURRENT_BUFFER_LVALUE =
				yy_create_buffer( yyin, YY_BUF_SIZE );
		}

		yy_load_buffer_state(  );
		}

	{

	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
		{
		yy_cp = (yy_c_buf_p);

		/* Support of yytext. */
		*yy_cp = (yy_hold_char);

		/* yy_bp points to the position in yy_ch_buf of the start of
		 * the current run.
		 */
		yy_bp = yy_cp;

		yy_current_state = (yy_start);
		yy_current_state += YY_AT_BOL();

		(yy_state_ptr) = (yy_state_buf);
		*(yy_state_ptr)++ = yy_current_state;

yy_match:
		do
			{
			YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 1444 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			*(yy_state_ptr)++ = yy_current_state;
			++yy_cp;
			}
		while ( yy_current_state != 1443 );

yy_find_action:
		yy_current_state = *--(yy_state_ptr);
		(yy_lp) = yy_accept[yy_current_state];
find_rule: /* we branch to this label when backing up */
		for ( ; ; ) /* until we find what rule we matched */
			{
			if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
				{
				yy_act = yy_acclist[(yy_lp)];
				if ( yy_act & YY_TRAILING_HEAD_MASK ||
				     (yy_looking_for_trail_begin) )
					{
					if ( yy_act == (yy_looking_for_trail_begin) )
						{
						(yy_looking_for_trail_begin) = 0;
						yy_act &= ~YY_TRAILING_HEAD_MASK;
						break;
						}
					}
				else if ( yy_act & YY_TRAILING_MASK )
					{
					(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
					(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
					(yy_full_match) = yy_cp;
					(yy_full_state) = (yy_state_ptr);
					(yy_full_lp) = (yy_lp);
					}
				else
					{
					(yy_full_match) = yy_cp;
					(yy_full_state) = (yy_state_ptr);
					(yy_full_lp) = (yy_lp);
					break;
					}
				++(yy_lp);
				goto find_rule;
				}
			--yy_cp;
			yy_current_state = *--(yy_state_ptr);
			(yy_lp) = yy_accept[yy_current_state];
			}

		YY_DO_BEFORE_ACTION;

do_action:	/* This label is used only to access EOF actions. */

		switch ( yy_act )
	{ /* beginning of action switch */
case 1:
YY_RULE_SETUP

	YY_BREAK
case 2:
YY_RULE_SETUP

	YY_BREAK
case 3:
YY_RULE_SETUP

	YY_BREAK
case 4:
YY_RULE_SETUP
{
      // Trigraph
      unput(resolveTrigraph(yytext[2]));
   }
	YY_BREAK
case 5:
YY_RULE_SETUP
{
      BEGIN(Command);
      s_yyColNr  += yyleng;
      s_yyMLines = 0;
   }
	YY_BREAK
case 6:
/* rule 6 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{

      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
      BEGIN(CopyLine);
   }
	YY_BREAK
case 7:
/* rule 7 can match eol */
YY_RULE_SETUP
{
      // constructors?
      int i;

      for (i = yyleng - 1; i >= 0; i--) {
         unput(yytext[i]);
      }

      BEGIN(CopyLine);
   }
	YY_BREAK
case 8:
/* rule 8 can match eol */
case 9:
/* rule 9 can match eol */
YY_RULE_SETUP
{

      // function list macro with one (...) argument, e.g. for K_GLOBAL_STATIC_WITH_ARGS
      // function like macro

      static const bool skipFuncMacros = Config::getBool("skip-function-macros");

      QString name = QString::fromUtf8(yytext);
      name = name.left(name.indexOf('(')).trimmed();

      QSharedPointer<A_Define> def;

      if (skipFuncMacros && ! s_insideFortran && name != "Q_PROPERTY" && ! ( (s_includeStack.isEmpty() || s_curlyCount > 0) && s_macroExpansion &&
                  (def = DefineManager::instance().isDefined(name)) && (! s_expandOnlyPredef || def->isPredefined)) ) {

         outputChar('\n');
         ++s_yyLineNr;

      } else {
         // do not skip

         for (int i = yyleng - 1; i >= 0; i--) {
            unput(yytext[i]);
         }

         BEGIN(CopyLine);
      }
   }
	YY_BREAK
case 10:
/* rule 10 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_yyLineNr += text.count('\n');
      outputArray(text, text.length());
   }
	YY_BREAK
case 11:
/* rule 11 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_delimiter = text.mid(2);
      s_delimiter.chop(1);

      outputArray(text, text.length());
      BEGIN(CopyRawString);
   }
	YY_BREAK
case 12:
YY_RULE_SETUP
{
      // count brackets inside the main file
      QString text = QString::fromUtf8(yytext);

      if (s_includeStack.isEmpty())  {
         ++s_curlyCount;
      }

      outputChar(text[0]);
   }
	YY_BREAK
case 13:
YY_RULE_SETUP
{
      // count brackets inside the main file
      QString text = QString::fromUtf8(yytext);

      if (s_includeStack.isEmpty() && s_curlyCount > 0)  {
         --s_curlyCount;
      }

      outputChar(text[0]);
   }
	YY_BREAK
case 14:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 15:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 16:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 17:
YY_RULE_SETUP
{
      if (getLanguageFromFileName(s_yyFileName) != SrcLangExt_CSharp) {
         REJECT;
      }

      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      BEGIN( CopyStringCs );
   }
	YY_BREAK
case 18:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);

      if (getLanguageFromFileName(s_yyFileName) != SrcLangExt_Fortran) {
         BEGIN(CopyString);
      } else {
         BEGIN(CopyStringFtnDouble);
      }
   }
	YY_BREAK
case 19:
YY_RULE_SETUP
{
      if (getLanguageFromFileName(s_yyFileName) != SrcLangExt_Fortran) {
         REJECT;
      }

      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);

      BEGIN( CopyStringFtn );
   }
	YY_BREAK
case 20:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 21:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 22:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 23:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);
      BEGIN( CopyLine );
   }
	YY_BREAK
case 24:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 25:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 26:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);
      BEGIN(CopyLine);
   }
	YY_BREAK
case 27:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 28:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 29:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);
      BEGIN( CopyLine );
   }
	YY_BREAK
case 30:
/* rule 30 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      QString tmp = text.mid(1);
      tmp.chop(1);

      if (tmp == s_delimiter) {
         BEGIN( CopyLine );
      }
   }
	YY_BREAK
case 31:
/* rule 31 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 32:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 33:
/* rule 33 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_expectGuard = false;
      QSharedPointer<A_Define> def;

      if ((s_includeStack.isEmpty() || s_curlyCount > 0) && s_macroExpansion &&
                  (def = DefineManager::instance().isDefined(text)) &&
                  (! s_expandOnlyPredef || def->isPredefined)) {

         // found it
         s_roundCount = 0;
         s_defArgsStr = text;

         if (def->nargs == -1) {
            // no function macro

            QString result = def->isPredefined ? def->m_definition : expandMacro(s_defArgsStr);
            outputArray(result, result.length());

         } else {
            // zero or more arguments

            s_findDefArgContext = CopyLine;
            BEGIN(FindDefineArgs);

         }

      } else {
         outputArray(text, text.length());
      }
   }
	YY_BREAK
case 34:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      QSharedPointer<A_Define> def;

      if ((s_includeStack.isEmpty() || s_curlyCount > 0) && s_macroExpansion &&
                  (def = DefineManager::instance().isDefined(text)) &&
                   def->nargs == -1 && (! s_expandOnlyPredef || def->isPredefined)) {

            QString result = def->isPredefined ? def->m_definition : expandMacro(text);
            outputArray(result, result.length());

      } else {
         outputArray(text, text.length());
      }
   }
	YY_BREAK
case 35:
/* rule 35 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      //  strip line continuation characters

      if (getLanguageFromFileName(s_yyFileName) == SrcLangExt_Fortran)  {
         QString text = QString::fromUtf8(yytext);
         outputChar(text[0]);
      }
   }
	YY_BREAK
case 36:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 37:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputChar(text[0]);
   }
	YY_BREAK
case 38:
/* rule 38 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      BEGIN(Start);
      ++s_yyLineNr;
      s_yyColNr = 1;
   }
	YY_BREAK
case 39:
YY_RULE_SETUP
{
      s_defArgsStr += '(';
      ++s_roundCount;
   }
	YY_BREAK
case 40:
YY_RULE_SETUP
{
      s_defArgsStr += ')';
      --s_roundCount;

      if (s_roundCount == 0) {
         QString result = expandMacro(s_defArgsStr);

         if (s_findDefArgContext == CopyLine) {
            outputArray(result, result.length());
            BEGIN(s_findDefArgContext);

         } else {
            readIncludeFile(result);
            s_nospaces = false;
            BEGIN(Start);
         }
      }
   }
	YY_BREAK
/*
<FindDefineArgs>")"{B}*"("       {
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;
   }
  */
case 41:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;
    }
	YY_BREAK
case 42:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;
      BEGIN(ArgCopyCComment);
   }
	YY_BREAK
case 43:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text[0];
      BEGIN(ReadString);
   }
	YY_BREAK
case 44:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      if (getLanguageFromFileName(s_yyFileName) != SrcLangExt_Fortran) {
         REJECT;
      }

      s_defArgsStr += text[0];
      BEGIN(ReadString);
   }
	YY_BREAK
case 45:
/* rule 45 can match eol */
YY_RULE_SETUP
{
      s_defArgsStr += ' ';
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 46:
YY_RULE_SETUP
{
      s_defArgsStr += "@@";
   }
	YY_BREAK
case 47:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text[0];
   }
	YY_BREAK
case 48:
YY_RULE_SETUP
{
      s_defArgsStr += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 49:
YY_RULE_SETUP
{
      s_defArgsStr += QString::fromUtf8(yytext);
      BEGIN(FindDefineArgs);
   }
	YY_BREAK
case 50:
/* rule 50 can match eol */
YY_RULE_SETUP
{
      s_defArgsStr += ' ';
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 51:
YY_RULE_SETUP
{
      s_defArgsStr += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 52:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text[0];
      BEGIN(FindDefineArgs);
   }
	YY_BREAK
case 53:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      if (getLanguageFromFileName(s_yyFileName) != SrcLangExt_Fortran) {
         REJECT;
      }

      s_defArgsStr += text[0];
      BEGIN(FindDefineArgs);
   }
	YY_BREAK
case 54:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      s_defArgsStr += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 55:
/* rule 55 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 1);
(yy_c_buf_p) = yy_cp = yy_bp + 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // continue line
   }
	YY_BREAK
case 56:
YY_RULE_SETUP
{
      s_defArgsStr += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 57:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text[0];
   }
	YY_BREAK
case 58:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_isImported = text[1] == 'm';

      if (s_macroExpansion) {
         BEGIN(IncludeID);
      }
   }
	YY_BREAK
case 59:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_isImported = text[1] == 'm';
      s_incName = text[text.length() - 1];
      BEGIN(Include);
   }
	YY_BREAK
case 60:
YY_RULE_SETUP
{
      s_yyColNr += yyleng;
      BEGIN(DefName);
   }
	YY_BREAK
case 61:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      s_guardExpr.resize(0);
      BEGIN(DefinedExpr2);
   }
	YY_BREAK
case 62:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      s_guardExpr.resize(0);
      BEGIN(DefinedExpr1);
   }
	YY_BREAK
case 63:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      s_guardExpr = "! ";
      BEGIN(DefinedExpr2);
   }
	YY_BREAK
case 64:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      s_guardExpr = "! ";
      BEGIN(DefinedExpr1);
   }
	YY_BREAK
case 65:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      s_guardExpr.resize(0);
      BEGIN(Guard);
   }
	YY_BREAK
case 66:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      if (! otherCaseDone()) {
         s_guardExpr.resize(0);
         BEGIN(Guard);

      } else {
         s_ifcount = 0;
         BEGIN(SkipCPPBlock);
      }
   }
	YY_BREAK
case 67:
/* rule 67 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 4);
(yy_c_buf_p) = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{

      if (otherCaseDone()) {
         s_ifcount = 0;
         BEGIN(SkipCPPBlock);

      } else {
         setCaseDone(true);
      }
   }
	YY_BREAK
case 68:
YY_RULE_SETUP
{
      BEGIN(UndefName);
   }
	YY_BREAK
case 69:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      if (! otherCaseDone()) {
         s_guardExpr.resize(0);
         BEGIN(Guard);
      }
   }
	YY_BREAK
case 70:
/* rule 70 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 5);
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      decrLevel();
   }
	YY_BREAK
case 71:
/* rule 71 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      BEGIN(Start);
      ++s_yyLineNr;
   }
	YY_BREAK
case 72:
YY_RULE_SETUP
{
      s_expectGuard = false;
   }
	YY_BREAK
case 73:
YY_RULE_SETUP
{
      // unknown directive
      BEGIN(IgnoreLine);
   }
	YY_BREAK
case 74:
/* rule 74 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      ++s_yyLineNr;
   }
	YY_BREAK
case 75:
YY_RULE_SETUP

	YY_BREAK
case 76:
YY_RULE_SETUP
{
      s_yyColNr += yyleng;
   }
	YY_BREAK
case 77:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      QSharedPointer<A_Define> def;

      if ((def = DefineManager::instance().isDefined(text)) && ! def->nonRecursive) {
         def->undef = true;
      }
      BEGIN(Start);
   }
	YY_BREAK
case 78:
/* rule 78 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      s_guardExpr += ' ';
      ++s_yyLineNr;
   }
	YY_BREAK
case 79:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 7;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      BEGIN(DefinedExpr2);
   }
	YY_BREAK
case 80:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 7;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      BEGIN(DefinedExpr1);
   }
	YY_BREAK
case 81:
/* rule 81 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 4);
(yy_c_buf_p) = yy_cp = yy_bp + 4;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "1L";
   }
	YY_BREAK
case 82:
/* rule 82 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 5);
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "0L";
   }
	YY_BREAK
case 83:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 3;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += '!';
   }
	YY_BREAK
case 84:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "!=";
   }
	YY_BREAK
case 85:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 3;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "&&";
   }
	YY_BREAK
case 86:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr+="||";
   }
	YY_BREAK
case 87:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 6;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "&";
   }
	YY_BREAK
case 88:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "|";
   }
	YY_BREAK
case 89:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 3;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "^";
   }
	YY_BREAK
case 90:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 5;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      s_guardExpr += "~";
   }
	YY_BREAK
case 91:
YY_RULE_SETUP
{
      s_guardExpr += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 92:
YY_RULE_SETUP
{
      s_guardExpr += "@@";
   }
	YY_BREAK
case 93:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_guardExpr += text[0];
   }
	YY_BREAK
case 94:
/* rule 94 can match eol */
YY_RULE_SETUP
{
      unput('\n');

      bool guard = computeExpression(s_guardExpr);
      setCaseDone(guard);

      if (guard) {
         BEGIN(Start);

      } else {
         s_ifcount = 0;
         BEGIN(SkipCPPBlock);
      }
   }
	YY_BREAK
case 95:
/* rule 95 can match eol */
YY_RULE_SETUP
{
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 96:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      if (DefineManager::instance().isDefined(text) || s_guardName == text) {
         s_guardExpr+=" 1L ";
      } else {
         s_guardExpr+=" 0L ";
      }

      s_lastGuardName = text;
      BEGIN(Guard);
   }
	YY_BREAK
case 97:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      if (DefineManager::instance().isDefined(text) || s_guardName == text){
         s_guardExpr+=" 1L ";
      } else {
         s_guardExpr+=" 0L ";
      }

      s_lastGuardName = text;
   }
	YY_BREAK
case 98:
/* rule 98 can match eol */
YY_RULE_SETUP
{
      // should not happen, handle anyway

      ++s_yyLineNr;
      s_ifcount = 0;
      BEGIN(SkipCPPBlock);
   }
	YY_BREAK
case 99:
YY_RULE_SETUP
{
      BEGIN(Guard);
   }
	YY_BREAK
case 100:
YY_RULE_SETUP

	YY_BREAK
case 101:
YY_RULE_SETUP
{
      BEGIN(SkipCommand);
   }
	YY_BREAK
case 102:
/* rule 102 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      BEGIN(SkipLine);
   }
	YY_BREAK
case 103:
/* rule 103 can match eol */
YY_RULE_SETUP
{
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 104:
YY_RULE_SETUP

	YY_BREAK
case 105:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      incrLevel();
      ++s_ifcount;
   }
	YY_BREAK
case 106:
YY_RULE_SETUP
{
      if (s_ifcount == 0 && ! otherCaseDone()) {
         setCaseDone(true);
         BEGIN(Start);
      }
   }
	YY_BREAK
case 107:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      if (s_ifcount == 0)  {

         if (! otherCaseDone()) {
            s_guardExpr.resize(0);
            s_lastGuardName.resize(0);
            BEGIN(Guard);

         } else {
            BEGIN(SkipCPPBlock);
         }
      }
   }
	YY_BREAK
case 108:
YY_RULE_SETUP
{
      s_expectGuard = false;
      decrLevel();

      if (--s_ifcount < 0) {
         BEGIN(Start);
      }
   }
	YY_BREAK
case 109:
/* rule 109 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      ++s_yyLineNr;
      BEGIN(SkipCPPBlock);
   }
	YY_BREAK
case 110:
YY_RULE_SETUP
{
      // unknown directive
      BEGIN(SkipLine);
   }
	YY_BREAK
case 111:
YY_RULE_SETUP

	YY_BREAK
case 112:
YY_RULE_SETUP

	YY_BREAK
case 113:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 114:
YY_RULE_SETUP
{
      BEGIN(SkipString);
   }
	YY_BREAK
case 115:
YY_RULE_SETUP

	YY_BREAK
case 116:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
   }
	YY_BREAK
case 117:
YY_RULE_SETUP
{
      s_lastCPPContext = YY_START;
      BEGIN(RemoveCPPComment);
   }
	YY_BREAK
case 118:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // */ (editor syntax fix)
   }
	YY_BREAK
case 119:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // */ (editor syntax fix)

      s_lastCContext=YY_START;
      BEGIN(RemoveCComment);
   }
	YY_BREAK
case 120:
/* rule 120 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      ++s_yyLineNr;
      BEGIN(SkipCPPBlock);
   }
	YY_BREAK
case 121:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 122:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 123:
YY_RULE_SETUP
{
      BEGIN(SkipLine);
   }
	YY_BREAK
case 124:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 125:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_nospaces   = true;
      s_roundCount = 0;
      s_defArgsStr = text;
      s_findDefArgContext = IncludeID;
      BEGIN(FindDefineArgs);
   }
	YY_BREAK
case 126:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_nospaces = true;
      readIncludeFile(expandMacro(text));
      BEGIN(Start);
   }
	YY_BREAK
case 127:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_incName += text;
      readIncludeFile(s_incName);

      if (s_isImported) {
         BEGIN(EndImport);
      } else {
         BEGIN(Start);
      }
   }
	YY_BREAK
case 128:
/* rule 128 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      BEGIN(Start);
   }
	YY_BREAK
case 129:
/* rule 129 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      ++s_yyLineNr;
   }
	YY_BREAK
case 130:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 131:
/* rule 131 can match eol */
YY_RULE_SETUP
{
      // define with argument

      s_argDict = QMakeShared<QHash<QString, int>>();

      s_defArgs = 0;
      s_defArgsStr.resize(0);
      s_defText.resize(0);
      s_defLitText.resize(0);

      s_defName    = QString::fromUtf8(yytext);
      s_defVarArgs = false;
      s_defExtraSpacing.resize(0);
      BEGIN(DefineArg);
   }
	YY_BREAK
case 132:
/* rule 132 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // special case: define with 1 -> can be "guard"

      s_argDict = QSharedPointer<QHash<QString, int>>();

      s_defArgs = -1;
      s_defArgsStr.resize(0);

      s_defName = QString::fromUtf8(yytext);
      s_defName = s_defName.left(s_defName.length() - 1).trimmed();
      s_defVarArgs = false;

      if (s_curlyCount > 0 || s_defName != s_lastGuardName || ! s_expectGuard) {
         // define may appear in the output
         QString tmp = "#define " + s_defName;
         outputArray(tmp, tmp.length());

         s_quoteArg      = false;
         s_insideComment = false;
         s_lastGuardName.resize(0);
         s_defText    = "1";
         s_defLitText = "1";
         BEGIN(DefineText);

      } else  {
         // define is a guard => hide

         s_defText.resize(0);
         s_defLitText.resize(0);
         BEGIN(Start);
      }

      s_expectGuard = false;
   }
	YY_BREAK
case 133:
/* rule 133 can match eol */
YY_RULE_SETUP
{
      // empty define
      QString text = QString::fromUtf8(yytext);

      s_argDict = QSharedPointer<QHash<QString, int>>();

      s_defArgs = -1;
      s_defName = text;

      s_defArgsStr.resize(0);
      s_defText.resize(0);
      s_defLitText.resize(0);
      s_defVarArgs = false;

      if (s_curlyCount > 0 || s_defName != s_lastGuardName || ! s_expectGuard) {
         // define may appear in the output
         QString tmp = "#define " + s_defName;
         outputArray(tmp, tmp.length());

         s_quoteArg      = false;
         s_insideComment = false;

         if (s_insideCS) {
            s_defText="1"; // for C#, use "1" as define text
         }

         BEGIN(DefineText);

      } else  {
         // define is a guard => hide

         s_guardName = text;
         s_lastGuardName.resize(0);
         BEGIN(Start);
      }

      s_expectGuard = false;
   }
	YY_BREAK
case 134:
YY_RULE_SETUP
{
      // define with content
      QString text = QString::fromUtf8(yytext);

      s_argDict = QSharedPointer<QHash<QString, int>>();

      s_defArgs = -1;
      s_defArgsStr.resize(0);

      s_defText.resize(0);
      s_defLitText.resize(0);
      s_defName    = text;
      s_defVarArgs = false;

      QString tmp = "#define " + s_defName + s_defArgsStr;
      outputArray(tmp, tmp.length());

      s_quoteArg      = false;
      s_insideComment = false;
      BEGIN(DefineText);
   }
	YY_BREAK
case 135:
/* rule 135 can match eol */
YY_RULE_SETUP
{
      s_defExtraSpacing += "\n";
      ++s_yyLineNr;
   }
	YY_BREAK
case 136:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;
   }
	YY_BREAK
case 137:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;
   }
	YY_BREAK
case 138:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;

      QString tmp = "#define " + s_defName + s_defArgsStr + s_defExtraSpacing;
      outputArray(tmp, tmp.length());

      s_quoteArg      = false;
      s_insideComment = false;
      BEGIN(DefineText);
   }
	YY_BREAK
case 139:
YY_RULE_SETUP
{
      // Variadic macro
      s_defVarArgs = true;
      s_defArgsStr +=  QString::fromUtf8(yytext);

      s_argDict->insert("__VA_ARGS__", s_defArgs);
      ++s_defArgs;
   }
	YY_BREAK
case 140:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defArgsStr += text;

      s_defVarArgs = text.endsWith("...");

      if (s_defVarArgs)  {
         // strip ellipsis
         text = text.left(text.length() - 3);
      }

      text = text.trimmed();

      s_argDict->insert(text, s_defArgs);
      ++s_defArgs;
   }
	YY_BREAK
/*
<DefineText>"/ **"|"/ *!"  {
      s_defText+=yytext;
      s_defLitText+=yytext;
      s_insideComment=true;
   }

<DefineText>"* /"          {
      s_defText+=yytext;
      s_defLitText+=yytext;
      s_insideComment=false;
   }
  */
case 141:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
       QString text = QString::fromUtf8(yytext);

      s_defText   += text;
      s_defLitText+= text;
      s_lastCContext = YY_START;
      s_commentCount = 1;
      BEGIN(CopyCComment);
   }
	YY_BREAK
case 142:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      s_lastCPPContext  = YY_START;
      s_defLitText     += ' ';
      BEGIN(SkipCPPComment);
   }
	YY_BREAK
case 143:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      if (text[0] == '/') {
         outputChar('/');
      }

      outputChar('*');
      outputChar('/');

      if (--s_commentCount <= 0) {

         if (s_lastCContext == Start) {
            // small hack to make sure that ^... rule will
            // match when going to Start... Example: "/*...*/ some stuff..."

            YY_CURRENT_BUFFER->yy_at_bol = 1;
         }

         BEGIN(s_lastCContext);
      }
   }
	YY_BREAK
case 144:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 145:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      outputChar('/');
      outputChar('*');

      // ++s_commentCount;
   }
	YY_BREAK
case 146:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 147:
YY_RULE_SETUP
{
      static const bool markdown = Config::getBool("markdown");

      if (! markdown) {
         REJECT;

      } else {
         QString text = QString::fromUtf8(yytext);
         outputArray(text, text.length());

         s_fenceSize = yyleng;
         BEGIN(SkipVerbatim);
      }
   }
	YY_BREAK
case 148:
YY_RULE_SETUP
{
      static const bool markdown = Config::getBool("markdown");

      if (! markdown) {
         REJECT;

      } else {
         QString text = QString::fromUtf8(yytext);
         outputArray(text, text.length());

         s_fenceSize = yyleng;
         BEGIN(SkipVerbatim);
      }
   }
	YY_BREAK
case 149:
/* rule 149 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      outputArray(text, text.length());
      s_yyLineNr += text.count('\n');
   }
	YY_BREAK
case 150:
/* rule 150 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      outputArray(text, text.length());

      s_yyLineNr += text.count('\n');
      s_fenceSize = 0;

      if (text[1] == 'f') {
         s_blockName = "f";

      } else {
         QString bn = text.mid(1);
         int i = bn.indexOf('{');

         // for \code{.c}
         if (i != -1) {
            bn = bn.left(i);
         }

         s_blockName = bn.trimmed();
      }
      BEGIN(SkipVerbatim);
   }
	YY_BREAK
case 151:
YY_RULE_SETUP
{
      // escaped @cond
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 152:
YY_RULE_SETUP
{
      // conditional section
      s_ccomment = true;
      s_condCtx  = YY_START;
      BEGIN(CondLineCpp);
   }
	YY_BREAK
case 153:
YY_RULE_SETUP
{
      // conditional section
      s_ccomment = false;
      s_condCtx  = YY_START;
      BEGIN(CondLineC);
   }
	YY_BREAK
case 154:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      startCondSection(text);

      if (s_skip) {
         if (YY_START == CondLineC) {
            // end C comment
            outputArray("*/", 2);
            s_ccomment = true;

         } else {
            s_ccomment = false;
         }

         BEGIN(SkipCond);

      } else {
         BEGIN(s_condCtx);

      }
   }
	YY_BREAK
case 155:
YY_RULE_SETUP
{
      // non-guard character
      unput(*yytext);
      startCondSection(" ");

      if (s_skip) {
         if (YY_START == CondLineC) {
            // end C comment
            outputArray("*/",2);
            s_ccomment = true;

         } else {
            s_ccomment = false;
         }

         BEGIN(SkipCond);

      } else {
         BEGIN(s_condCtx);
      }
   }
	YY_BREAK
case 156:
/* rule 156 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // no guard
      if (YY_START == SkipCComment) {
         s_ccomment=true;
         // end C comment
         outputArray("*/",2);

      } else {
         s_ccomment = false;
      }

      s_condCtx = YY_START;
      startCondSection(" ");
      BEGIN(SkipCond);
   }
	YY_BREAK
case 157:
/* rule 157 can match eol */
YY_RULE_SETUP
{
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 158:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 159:
YY_RULE_SETUP
{
   }
	YY_BREAK
case 160:
YY_RULE_SETUP
{
      s_ccomment = false;
   }
	YY_BREAK
case 161:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      s_ccomment = true;
   }
	YY_BREAK
case 162:
/* rule 162 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 9);
(yy_c_buf_p) = yy_cp = yy_bp + 9;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      if (! s_skip) {
         QString text = QString::fromUtf8(yytext);
         outputArray(text, text.length());
      }
   }
	YY_BREAK
case 163:
/* rule 163 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 8);
(yy_c_buf_p) = yy_cp = yy_bp + 8;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      bool oldSkip = s_skip;
      endCondSection();

      if (oldSkip && ! s_skip) {
         if (s_ccomment) {
            outputArray("/** ",4);

            // */ (editor syntax fix)
         }

         BEGIN(s_condCtx);
      }
   }
	YY_BREAK
case 164:
/* rule 164 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_bp + 8);
(yy_c_buf_p) = yy_cp = yy_bp + 8;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      bool oldSkip = s_skip;
      endCondSection();

      if (oldSkip && ! s_skip)  {
         BEGIN(s_condCtx);
      }
   }
	YY_BREAK
case 165:
YY_RULE_SETUP
{
      /* end of verbatim block */

      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      if (text[1] == 'f' && s_blockName == "f") {
         BEGIN(SkipCComment);

      } else if (text.mid(4) == s_blockName) {
         BEGIN(SkipCComment);
      }
   }
	YY_BREAK
case 166:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      if (s_fenceSize == yyleng) {
         BEGIN(SkipCComment);
      }
   }
	YY_BREAK
case 167:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());

      if (s_fenceSize == yyleng) {
         BEGIN(SkipCComment);
      }
   }
	YY_BREAK
case 168:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 169:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 170:
/* rule 170 can match eol */
YY_RULE_SETUP
{
      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 171:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 172:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defLitText += text;
      s_defText    += escapeAt(text);
   }
	YY_BREAK
case 173:
/* rule 173 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defLitText += text;

      s_defText += " ";
      ++s_yyLineNr;
      ++s_yyMLines;
   }
	YY_BREAK
case 174:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defLitText += text;
      s_defText    += text;
      BEGIN(s_lastCContext);
   }
	YY_BREAK
case 175:
/* rule 175 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      ++s_yyLineNr;

      s_defLitText += text;
      s_defText    += ' ';

      outputChar('\n');
   }
	YY_BREAK
case 176:
YY_RULE_SETUP
{
      // see bug 594021 for a usecase for this rule
      if (s_lastCContext == SkipCPPBlock) {
         BEGIN(SkipCommand);

      } else {
         REJECT;
      }
   }
	YY_BREAK
case 177:
YY_RULE_SETUP
{
      BEGIN(s_lastCContext);
   }
	YY_BREAK
case 178:
YY_RULE_SETUP

	YY_BREAK
case 179:
YY_RULE_SETUP

	YY_BREAK
case 180:
YY_RULE_SETUP

	YY_BREAK
case 181:
/* rule 181 can match eol */
YY_RULE_SETUP
{
      // */ (editor syntax fix)

      ++s_yyLineNr;
      outputChar('\n');
   }
	YY_BREAK
case 182:
YY_RULE_SETUP

	YY_BREAK
case 183:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 184:
/* rule 184 can match eol */
YY_RULE_SETUP
{
      unput(*yytext);
      BEGIN(s_lastCPPContext);
   }
	YY_BREAK
case 185:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      outputChar('/');
      outputChar('*');
   }
	YY_BREAK
case 186:
YY_RULE_SETUP
{
      outputChar('/');
      outputChar('/');
   }
	YY_BREAK
case 187:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      outputArray(text, text.length());
   }
	YY_BREAK
case 188:
YY_RULE_SETUP
{
      outputChar(*yytext);
   }
	YY_BREAK
case 189:
YY_RULE_SETUP

	YY_BREAK
case 190:
YY_RULE_SETUP

	YY_BREAK
case 191:
YY_RULE_SETUP

	YY_BREAK
case 192:
YY_RULE_SETUP

	YY_BREAK
case 193:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
{
      // */ (editor syntax fix)

      s_quoteArg   = true;
      s_idStart    = true;
      s_defLitText += QString::fromUtf8(yytext);
   }
	YY_BREAK
case 194:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defLitText += text;

      if (s_quoteArg) {
         s_defText+="\"";
      }

      if (s_defArgs > 0) {
         auto iter = s_argDict->find(text);

         if (iter != s_argDict->end()) {
            int n = iter.value();

            s_defText += '@';

            QString numStr = QString("%1").formatArg(n);
            s_defText += numStr;

         } else {

            if (s_idStart) {
               warn(s_yyFileName, s_yyLineNr, "# character must appear before a macro parameter %s: %s",
                  csPrintable(s_defName), csPrintable(s_defLitText.trimmed()));
            }

            s_defText += text;

         }

      } else {
         s_defText += text;
      }

      if (s_quoteArg) {
         s_defText += "\"";
      }

      s_quoteArg = false;
      s_idStart  = false;
   }
	YY_BREAK
case 195:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defLitText += text;
      s_defText    += text;
   }
	YY_BREAK
case 196:
/* rule 196 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defLitText += text;
      outputChar('\n');
      s_defText += ' ';
      ++s_yyLineNr;
      ++s_yyMLines;
   }
	YY_BREAK
case 197:
/* rule 197 can match eol */
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      QString comment = extractTrailingComment(s_defLitText);
      s_defText = s_defText.trimmed();

      if (s_defText.startsWith("##")) {
         warn(s_yyFileName, s_yyLineNr, "## characters can not occur at the beginning of a macro definition %s: %s",
             csPrintable(s_defName), csPrintable(s_defLitText.trimmed()));

      } else if (s_defText.endsWith("##")) {
         warn(s_yyFileName, s_yyLineNr, "## characters can not occur at the end of a macro definition %s: %s",
             csPrintable(s_defName), csPrintable(s_defLitText.trimmed()));

      } else if (s_defText.endsWith("#")) {
         warn(s_yyFileName, s_yyLineNr, "Expected formal parameter after # character in macro definition %s: %s",
             csPrintable(s_defName), csPrintable(s_defLitText.trimmed()));
      }
      s_defLitText += text;

      if (! comment.isEmpty()) {
         outputArray(comment, comment.length());
         s_defLitText = s_defLitText.left(s_defLitText.length() - comment.length() - 1);
      }

      outputChar('\n');

      QSharedPointer<A_Define> def;

      if (s_includeStack.isEmpty() || s_curlyCount > 0) {
         addDefine();
      }

      def = DefineManager::instance().isDefined(s_defName);

      if (def == nullptr)  {
         // new define

         QSharedPointer<A_Define> nd = newDefine();
         DefineManager::instance().addDefine(s_yyFileName, nd);

      } else if (def) {
         // name already exists

         if (def->undef) {
            // undefined name
            def->undef        = false;
            def->m_name       = s_defName;
            def->m_definition = s_defText.trimmed();
            def->nargs        = s_defArgs;
            def->m_fileName   = s_yyFileName;
            def->lineNr       = s_yyLineNr - s_yyMLines;
            def->columnNr     = s_yyColNr;
         }
      }

      s_argDict = QSharedPointer<QHash<QString, int>>();

      ++s_yyLineNr;
      s_yyColNr = 1;
      s_lastGuardName.resize(0);
      BEGIN(Start);
   }
	YY_BREAK
case 198:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defText    += ' ';
      s_defLitText += text;
   }
	YY_BREAK
case 199:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defText    += "##";
      s_defLitText += text;
   }
	YY_BREAK
case 200:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);
      s_defText     += "@@";
      s_defLitText  += text;
   }
	YY_BREAK
case 201:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;

      if (! s_insideComment) {
         BEGIN(SkipDoubleQuote);
      }
   }
	YY_BREAK
case 202:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;

      if (! s_insideComment) {
         BEGIN(SkipSingleQuote);
      }
   }
	YY_BREAK
case 203:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text;
      s_defLitText += text;
   }
	YY_BREAK
case 204:
YY_RULE_SETUP
{
      // */ (editor syntax fix)
      QString text = QString::fromUtf8(yytext);

      s_defText    += text;
      s_defLitText += text;
   }
	YY_BREAK
case 205:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;
      BEGIN(DefineText);
   }
	YY_BREAK
case 206:
YY_RULE_SETUP
{
     QString text = QString::fromUtf8(yytext);

      s_defText    += text;
      s_defLitText += text;
   }
	YY_BREAK
case 207:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;
      BEGIN(DefineText);
   }
	YY_BREAK
case 208:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;
   }
	YY_BREAK
case 209:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;
   }
	YY_BREAK
case 210:
YY_RULE_SETUP
{
      QString text = QString::fromUtf8(yytext);

      s_defText    += text[0];
      s_defLitText += text;
   }
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(Start):
case YY_STATE_EOF(Command):
case YY_STATE_EOF(SkipCommand):
case YY_STATE_EOF(SkipLine):
case YY_STATE_EOF(SkipString):
case YY_STATE_EOF(CopyLine):
case YY_STATE_EOF(CopyString):
case YY_STATE_EOF(CopyStringCs):
case YY_STATE_EOF(CopyStringFtn):
case YY_STATE_EOF(CopyStringFtnDouble):
case YY_STATE_EOF(CopyRawString):
case YY_STATE_EOF(Include):
case YY_STATE_EOF(IncludeID):
case YY_STATE_EOF(EndImport):
case YY_STATE_EOF(DefName):
case YY_STATE_EOF(DefineArg):
case YY_STATE_EOF(DefineText):
case YY_STATE_EOF(SkipCPPBlock):
case YY_STATE_EOF(Ifdef):
case YY_STATE_EOF(Ifndef):
case YY_STATE_EOF(SkipCComment):
case YY_STATE_EOF(ArgCopyCComment):
case YY_STATE_EOF(CopyCComment):
case YY_STATE_EOF(SkipVerbatim):
case YY_STATE_EOF(SkipCPPComment):
case YY_STATE_EOF(RemoveCComment):
case YY_STATE_EOF(RemoveCPPComment):
case YY_STATE_EOF(Guard):
case YY_STATE_EOF(DefinedExpr1):
case YY_STATE_EOF(DefinedExpr2):
case YY_STATE_EOF(SkipDoubleQuote):
case YY_STATE_EOF(SkipSingleQuote):
case YY_STATE_EOF(UndefName):
case YY_STATE_EOF(IgnoreLine):
case YY_STATE_EOF(FindDefineArgs):
case YY_STATE_EOF(ReadString):
case YY_STATE_EOF(CondLineC):
case YY_STATE_EOF(CondLineCpp):
case YY_STATE_EOF(SkipCond):
{
      DBG_CTX((stderr, "End of include file\n"));

      if (s_includeStack.isEmpty()) {
         DBG_CTX((stderr, "Terminating scanner\n"));
         yyterminate();

      } else {
         QSharedPointer<FileState> fs = s_includeStack.pop();

         YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
         preYY_switch_to_buffer(fs->bufState );
         preYY_delete_buffer(oldBuf );

         s_yyLineNr      = fs->lineNr;
         s_inputString   = fs->oldFileBuf;
         s_inputPosition = fs->oldFileBufPos;
         s_curlyCount    = fs->curlyCount;
         setFileName(fs->fileName);

         DBG_CTX((stderr, "######## FileName %s\n", csPrintable(s_yyFileName)));

         // deal with file changes due to
         // #include's within { .. } blocks

         QString lineStr = QString("# %1 \"%2\" 2").formatArg(s_yyLineNr).formatArg(QString(s_yyFileName));
         outputArray(lineStr, lineStr.length());
      }
   }
	YY_BREAK
case 211:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp = yy_bp + 2;
YY_DO_BEFORE_ACTION; /* set up yytext again */
case 212:
YY_RULE_SETUP
{
      // */ (editor syntax fix)

      if (YY_START == SkipVerbatim || YY_START == SkipCond) {
         REJECT;

      } else {
         QString text = QString::fromUtf8(yytext);
         outputArray(text, text.length());

         s_lastCContext = YY_START;
         s_commentCount = 1;

         if (yyleng == 3) {
            s_lastGuardName.resize(0); // reset guard in case the #define is documented
         }

         BEGIN(SkipCComment);
      }
   }
	YY_BREAK
case 213:
YY_RULE_SETUP
{
      if (YY_START == SkipVerbatim || YY_START == SkipCond || getLanguageFromFileName(s_yyFileName) == SrcLangExt_Fortran) {
         REJECT;

      } else {
         QString text = QString::fromUtf8(yytext);
         outputArray(text, text.length());

         s_lastCPPContext = YY_START;

         if (yyleng == 3) {
            s_lastGuardName.resize(0); // reset guard in case the #define is documented
         }

         BEGIN(SkipCPPComment);
      }
   }
	YY_BREAK
case 214:
/* rule 214 can match eol */
YY_RULE_SETUP
{
      outputChar('\n');
      ++s_yyLineNr;
   }
	YY_BREAK
case 215:
YY_RULE_SETUP
{
      // utf-8 code point
      QString text  = QString::fromUtf8(yytext);
      s_expectGuard = false;

      for (QChar c : text) {
         outputChar(c);
      }
   }
	YY_BREAK
case 216:
YY_RULE_SETUP
{
      // catch all
      QString text  = QString::fromUtf8(yytext);
      s_expectGuard = false;

      for (QChar c : text) {
         outputChar(c);
      }
   }
	YY_BREAK
case 217:
YY_RULE_SETUP
ECHO;
	YY_BREAK

	case YY_END_OF_BUFFER:
		{
		/* Amount of text matched not including the EOB char. */
		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = (yy_hold_char);
		YY_RESTORE_YY_MORE_OFFSET

		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
			{
			/* We're scanning a new file or input source.  It's
			 * possible that this happened because the user
			 * just pointed yyin at a new source and called
			 * yylex().  If so, then we have to assure
			 * consistency between YY_CURRENT_BUFFER and our
			 * globals.  Here is the right place to do so, because
			 * this is the first action (other than possibly a
			 * back-up) that will match for the new input source.
			 */
			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state(  );

			/* Okay, we're now positioned to make the NUL
			 * transition.  We couldn't have
			 * yy_get_previous_state() go ahead and do it
			 * for us because it doesn't know how to deal
			 * with the possibility of jamming (and we don't
			 * want to build jamming into it because then it
			 * will run more slowly).
			 */

			yy_next_state = yy_try_NUL_trans( yy_current_state );

			yy_bp = (yytext_ptr) + YY_MORE_ADJ;

			if ( yy_next_state )
				{
				/* Consume the NUL. */
				yy_cp = ++(yy_c_buf_p);
				yy_current_state = yy_next_state;
				goto yy_match;
				}

			else
				{
				yy_cp = (yy_c_buf_p);
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer(  ) )
			{
			case EOB_ACT_END_OF_FILE:
				{
				(yy_did_buffer_switch_on_eof) = 0;

				if ( yywrap(  ) )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * yytext, we can now set up
					 * yy_c_buf_p so that if some total
					 * hoser (like flex itself) wants to
					 * call the scanner after we return the
					 * YY_NULL, it'll still work - another
					 * YY_NULL will get returned.
					 */
					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				(yy_c_buf_p) =
					(yytext_ptr) + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_match;

			case EOB_ACT_LAST_MATCH:
				(yy_c_buf_p) =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];

				yy_current_state = yy_get_previous_state(  );

				yy_cp = (yy_c_buf_p);
				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
				goto yy_find_action;
			}
		break;
		}

	default:
		YY_FATAL_ERROR(
			"fatal flex scanner internal error--no action found" );
	} /* end of action switch */
		} /* end of scanning one token */
	} /* end of user's declarations */
} /* end of yylex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (void)
{
    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = (yytext_ptr);
	int number_to_move, i;
	int ret_val;

	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
		{ /* Don't try to fill the buffer, so this is an EOF. */
		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

		else
			{
			/* We matched some text prior to the EOB, first
			 * process it.
			 */
			return EOB_ACT_LAST_MATCH;
			}
		}

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);

	for ( i = 0; i < number_to_move; ++i )
		*(dest++) = *(source++);

	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
		/* don't do the read, it's not guaranteed to return an EOF,
		 * just force an EOF
		 */
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;

	else
		{
			int num_to_read =
			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */

			YY_FATAL_ERROR(
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
			(yy_n_chars), num_to_read );

		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	if ( (yy_n_chars) == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			yyrestart( yyin  );
			}

		else
			{
			ret_val = EOB_ACT_LAST_MATCH;
			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
		/* "- 2" to take care of EOB's */
		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
	}

	(yy_n_chars) += number_to_move;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;

	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];

	return ret_val;
}

/* yy_get_previous_state - get the state just before the EOB char was reached */

    static yy_state_type yy_get_previous_state (void)
{
	yy_state_type yy_current_state;
	char *yy_cp;
    
	yy_current_state = (yy_start);
	yy_current_state += YY_AT_BOL();

	(yy_state_ptr) = (yy_state_buf);
	*(yy_state_ptr)++ = yy_current_state;

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
		{
		YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 86);
		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
			{
			yy_current_state = (int) yy_def[yy_current_state];
			if ( yy_current_state >= 1444 )
				yy_c = yy_meta[yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
		*(yy_state_ptr)++ = yy_current_state;
		}

	return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
{
	int yy_is_jam;
    
	YY_CHAR yy_c = 86;
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 1444 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 1443);
	if ( ! yy_is_jam )
		*(yy_state_ptr)++ = yy_current_state;

		return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_UNPUT

    static void yyunput (int c, char * yy_bp )
{
	char *yy_cp;
    
    yy_cp = (yy_c_buf_p);

	/* undo effects of setting up yytext */
	*yy_cp = (yy_hold_char);

	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
		{ /* need to shift things up to make room */
		/* +2 for EOB chars. */
		int number_to_move = (yy_n_chars) + 2;
		char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
		char *source =
				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];

		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			*--dest = *--source;

		yy_cp += (int) (dest - source);
		yy_bp += (int) (dest - source);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
			(yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;

		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
			YY_FATAL_ERROR( "flex scanner push-back overflow" );
		}

	*--yy_cp = (char) c;

	(yytext_ptr) = yy_bp;
	(yy_hold_char) = *yy_cp;
	(yy_c_buf_p) = yy_cp;
}

#endif

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (void)
#else
    static int input  (void)
#endif

{
	int c;
    
	*(yy_c_buf_p) = (yy_hold_char);

	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
		{
		/* yy_c_buf_p now points to the character we want to return.
		 * If this occurs *before* the EOB characters, then it's a
		 * valid NUL; if not, then we've hit the end of the buffer.
		 */
		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
			/* This was really a NUL. */
			*(yy_c_buf_p) = '\0';

		else
			{ /* need more input */
			int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
			++(yy_c_buf_p);

			switch ( yy_get_next_buffer(  ) )
				{
				case EOB_ACT_LAST_MATCH:
					/* This happens because yy_g_n_b()
					 * sees that we've accumulated a
					 * token and flags that we need to
					 * try matching the token before
					 * proceeding.  But for input(),
					 * there's no matching to consider.
					 * So convert the EOB_ACT_LAST_MATCH
					 * to EOB_ACT_END_OF_FILE.
					 */

					/* Reset buffer status. */
					yyrestart( yyin );

					/*FALLTHROUGH*/

				case EOB_ACT_END_OF_FILE:
					{
					if ( yywrap(  ) )
						return 0;

					if ( ! (yy_did_buffer_switch_on_eof) )
						YY_NEW_FILE;
#ifdef __cplusplus
					return yyinput();
#else
					return input();
#endif
					}

				case EOB_ACT_CONTINUE_SCAN:
					(yy_c_buf_p) = (yytext_ptr) + offset;
					break;
				}
			}
		}

	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
	*(yy_c_buf_p) = '\0';	/* preserve yytext */
	(yy_hold_char) = *++(yy_c_buf_p);

	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');

	return c;
}
#endif	/* ifndef YY_NO_INPUT */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * 
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void yyrestart  (FILE * input_file )
{
    
	if ( ! YY_CURRENT_BUFFER ){
        yyensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            yy_create_buffer( yyin, YY_BUF_SIZE );
	}

	yy_init_buffer( YY_CURRENT_BUFFER, input_file );
	yy_load_buffer_state(  );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
{
    
	/* TODO. We should be able to replace this entire function body
	 * with
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	yyensure_buffer_stack ();
	if ( YY_CURRENT_BUFFER == new_buffer )
		return;

	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*(yy_c_buf_p) = (yy_hold_char);
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	YY_CURRENT_BUFFER_LVALUE = new_buffer;
	yy_load_buffer_state(  );

	/* We don't actually know whether we did this switch during
	 * EOF (yywrap()) processing, but the only time this flag
	 * is looked at is after yywrap() is called, so it's safe
	 * to go ahead and always set it.
	 */
	(yy_did_buffer_switch_on_eof) = 1;
}

static void yy_load_buffer_state  (void)
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	(yy_hold_char) = *(yy_c_buf_p);
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * 
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_buf_size = size;

	/* yy_ch_buf has to be 2 characters longer than the size given because
	 * we need to put in 2 end-of-buffer characters.
	 */
	b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2)  );
	if ( ! b->yy_ch_buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_is_our_buffer = 1;

	yy_init_buffer( b, file );

	return b;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * 
 */
    void yy_delete_buffer (YY_BUFFER_STATE  b )
{
    
	if ( ! b )
		return;

	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		yyfree( (void *) b->yy_ch_buf  );

	yyfree( (void *) b  );
}

/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a yyrestart() or at EOF.
 */
    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )

{
	int oerrno = errno;
    
	yy_flush_buffer( b );

	b->yy_input_file = file;
	b->yy_fill_buffer = 1;

    /* If b is the current buffer, then yy_init_buffer was _probably_
     * called from yyrestart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = 0;
    
	errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * 
 */
    void yy_flush_buffer (YY_BUFFER_STATE  b )
{
    	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == YY_CURRENT_BUFFER )
		yy_load_buffer_state(  );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
{
    	if (new_buffer == nullptr)
		return;

	yyensure_buffer_stack();

	/* This block is copied from yy_switch_to_buffer. */
	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*(yy_c_buf_p) = (yy_hold_char);
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	/* Only push if top exists. Otherwise, replace top. */
	if (YY_CURRENT_BUFFER)
		(yy_buffer_stack_top)++;
	YY_CURRENT_BUFFER_LVALUE = new_buffer;

	/* copied from yy_switch_to_buffer. */
	yy_load_buffer_state(  );
	(yy_did_buffer_switch_on_eof) = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
void yypop_buffer_state (void)
{
    	if (!YY_CURRENT_BUFFER)
		return;

	yy_delete_buffer(YY_CURRENT_BUFFER );
	YY_CURRENT_BUFFER_LVALUE = nullptr;
	if ((yy_buffer_stack_top) > 0)
		--(yy_buffer_stack_top);

	if (YY_CURRENT_BUFFER) {
		yy_load_buffer_state(  );
		(yy_did_buffer_switch_on_eof) = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void yyensure_buffer_stack (void)
{
	yy_size_t num_to_alloc;
    
	if (!(yy_buffer_stack)) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));

		(yy_buffer_stack_max) = num_to_alloc;
		(yy_buffer_stack_top) = 0;
		return;
	}

	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){

		/* Increase the buffer to prepare for a possible push. */
		yy_size_t grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = (yy_buffer_stack_max) + grow_size;
		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
		(yy_buffer_stack_max) = num_to_alloc;
	}
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
{
	YY_BUFFER_STATE b;
    
	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return nullptr;

	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );

	b->yy_buf_size = (int) (size - 2);	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = nullptr;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	yy_switch_to_buffer( b  );

	return b;
}

/** Setup the input buffer state to scan a string. The next call to yylex() will
 * scan from a @e copy of @a str.
 * @param yystr a NUL-terminated string to scan
 * 
 * @return the newly allocated buffer state object.
 * @note If you want to scan bytes that may contain NUL values, then use
 *       yy_scan_bytes() instead.
 */
YY_BUFFER_STATE yy_scan_string (const char * yystr )
{
    
	return yy_scan_bytes( yystr, (int) strlen(yystr) );
}

/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
 * scan from a @e copy of @a bytes.
 * @param yybytes the byte buffer to scan
 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = (yy_size_t) (_yybytes_len + 2);
	buf = (char *) yyalloc( n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

	for ( i = 0; i < _yybytes_len; ++i )
		buf[i] = yybytes[i];

	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;

	b = yy_scan_buffer( buf, n );
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );

	/* It's okay to grow etc. this buffer, and we should throw it
	 * away when we're done.
	 */
	b->yy_is_our_buffer = 1;

	return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yynoreturn yy_fatal_error (const char* msg )
{
			fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
}

/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		yytext[yyleng] = (yy_hold_char); \
		(yy_c_buf_p) = yytext + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

/* Accessor  methods (get/set functions) to struct members. */

/** Get the current line number.
 * 
 */
int yyget_lineno  (void)
{
    
    return yylineno;
}

/** Get the input stream.
 * 
 */
FILE *yyget_in  (void)
{
        return yyin;
}

/** Get the output stream.
 * 
 */
FILE *yyget_out  (void)
{
        return yyout;
}

/** Get the length of the current token.
 * 
 */
int yyget_leng  (void)
{
        return yyleng;
}

/** Get the current token.
 * 
 */

char *yyget_text  (void)
{
        return yytext;
}

/** Set the current line number.
 * @param _line_number line number
 * 
 */
void yyset_lineno (int  _line_number )
{
    
    yylineno = _line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param _in_str A readable stream.
 * 
 * @see yy_switch_to_buffer
 */
void yyset_in (FILE *  _in_str )
{
        yyin = _in_str ;
}

void yyset_out (FILE *  _out_str )
{
        yyout = _out_str ;
}

int yyget_debug  (void)
{
        return yy_flex_debug;
}

void yyset_debug (int  _bdebug )
{
        yy_flex_debug = _bdebug ;
}

static int yy_init_globals (void)
{
        /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from yylex_destroy(), so don't allocate here.
     */

    (yy_buffer_stack) = nullptr;
    (yy_buffer_stack_top) = 0;
    (yy_buffer_stack_max) = 0;
    (yy_c_buf_p) = nullptr;
    (yy_init) = 0;
    (yy_start) = 0;

    (yy_state_buf) = 0;
    (yy_state_ptr) = 0;
    (yy_full_match) = 0;
    (yy_lp) = 0;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = nullptr;
    yyout = nullptr;
#endif

    /* For future reference: Set errno on error, since we are called by
     * yylex_init()
     */
    return 0;
}

/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (void)
{
    
    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		yy_delete_buffer( YY_CURRENT_BUFFER  );
		YY_CURRENT_BUFFER_LVALUE = nullptr;
		yypop_buffer_state();
	}

	/* Destroy the stack itself. */
	yyfree((yy_buffer_stack) );
	(yy_buffer_stack) = nullptr;

    yyfree ( (yy_state_buf) );
    (yy_state_buf)  = nullptr;

    /* Reset the globals. This is important in a non-reentrant scanner so the next time
     * yylex() is called, initialization will occur. */
    yy_init_globals( );

    return 0;
}

/*
 * Internal utility routines.
 */

#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, const char * s2, int n )
{
		
	int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
}
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (const char * s )
{
	int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
}
#endif

void *yyalloc (yy_size_t  size )
{
			return malloc(size);
}

void *yyrealloc  (void * ptr, yy_size_t  size )
{
		
	/* The cast to (char *) in the following accommodates both
	 * implementations that use char* generic pointers, and those
	 * that use void* generic pointers.  It works with the latter
	 * because both ANSI C and C++ allow castless assignment from
	 * any pointer type to void*, and deal with argument conversions
	 * as though doing an assignment.
	 */
	return realloc(ptr, size);
}

void yyfree (void * ptr )
{
			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

static int getNextChar(const QString &expr, QString *rest, uint &pos)
{
   if (pos < expr.length()) {
      return expr.at(pos++).unicode();

   } else if (rest && ! rest->isEmpty()) {
      int cc  = rest->at(0).unicode();
      *rest   = rest->right(rest->length() - 1);
      return cc;

   } else {
      int cc = yyinput();

      return cc;
   }
}

static int getCurrentChar(const QString &expr, QString *rest, uint pos)
{
   if (pos < expr.length()) {
      return expr.at(pos).unicode();

   } else if (rest && ! rest->isEmpty()) {
      int cc = rest->at(0).unicode();
      return cc;

   } else {
      int cc = yyinput();

      returnCharToStream(cc);
      return cc;
   }
}

static void unputChar(const QString &expr, QString *rest, uint &pos, char c)
{
   if (pos < expr.length()) {
      ++pos;

   } else if (rest) {
      char cs[2];
      cs[0] = c;
      cs[1] = '\0';
      rest->prepend(cs);

   } else {

      returnCharToStream(c);
   }
}

void addSearchDir(const QString &dir)
{
   QFileInfo fi(dir);

   if (fi.isDir()) {
      s_pathList.append(fi.absoluteFilePath());
   }
}

void initPreprocessor()
{
   addSearchDir(".");
   s_expandedDict = QMakeShared<DefineDict>();
}

void removePreProcessor()
{
   s_expandedDict = QSharedPointer<DefineDict>();
   s_pathList.clear();

   DefineManager::deleteInstance();
}

QString preprocessFile(const QString &fileName, const QString &input)
{
   printlex(preYY_flex_debug, true, __FILE__, fileName);

   s_macroExpansion   = Config::getBool("macro-expansion");
   s_expandOnlyPredef = Config::getBool("expand-only-predefined");

   s_skip        = false;
   s_curlyCount  = 0;
   s_nospaces    = false;

   s_inputPosition  = 0;
   s_inputString    = input;
   s_outputString   = "";

   s_includeStack.clear();
   s_expandedDict->clear();
   s_condStack.clear();

   setFileName(fileName);

   s_inputFileDef = s_yyFileDef;
   DefineManager::instance().startContext(s_yyFileName);

   static bool firstTime = true;

   if (firstTime)  {
      // add predefined macros
      static const QStringList preDefinedMacros = Config::getList("predefined-macros");

      for (const auto &definedMacro : preDefinedMacros) {

         int posEquals = definedMacro.indexOf('=');
         int posOpen   = definedMacro.indexOf('(');
         int posClose  = definedMacro.indexOf(')');

         bool nonRecursive = posEquals > 0 && definedMacro.at(posEquals - 1) == ':';

         if (posOpen == 0) {
            // no define name
            continue;
         }

         if (posOpen < posEquals && posClose < posEquals && posOpen != -1  &&
                  posClose != -1  &&  posOpen < posClose) {

            // predefined function macro definition

            // regexp matching an id
            static QRegularExpression regExp_id("[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*");
            QHash<QString, int> argDict;

            QString args    = definedMacro.mid(posOpen + 1, posClose - posOpen - 1);
            bool hasVarArgs = args.contains("...");

            int index = posOpen + 1;
            int count = 0;
            int len;

            QRegularExpressionMatch match = regExp_id.match(definedMacro, definedMacro.constBegin() + index);

            // gather the formal arguments in a dictionary
            while (index < posClose) {

               if (match.hasMatch()) {
                  len = match.capturedLength();

                  if (len > 0) {
                     argDict.insert(match.captured(), count);
                     index = match.capturedEnd() - definedMacro.begin();

                     ++count;

                  } else {
                     ++index;
                  }

               } else {
                  break;
               }

               match = regExp_id.match(definedMacro, definedMacro.constBegin() + index);
            }

            if (hasVarArgs) {
              // add the variable argument if present
              argDict.insert("__VA_ARGS__", count);
              ++count;
            }

            // strip definition part
            QString tmp = definedMacro.right(definedMacro.length() - posEquals - 1);
            QString definition;

            index = 0;
            match = regExp_id.match(tmp);

            // substitute all occurrences of formal arguments with their corresponding markers
            while (match.hasMatch()) {

               int p = match.capturedStart() - tmp.constBegin();
               len   = match.capturedLength();

               definition += tmp.mid(index, p - index);

               auto iter = argDict.find(match.captured());

               if (iter != argDict.end()) {
                  int argIndex = iter.value();

                  QString marker = QString(" @%1 ").formatArg(argIndex);
                  definition += marker;

               } else {
                  definition += match.captured();
               }

               index = p + len;
               match = regExp_id.match(tmp, match.capturedEnd());
            }

            if (index < tmp.length()) {
               definition += tmp.mid(index, tmp.length() - index);
            }

            // add define definition to the dictionary of defines for this file
            QString dname = definedMacro.left(posOpen);

            if (! dname.isEmpty()) {
               QSharedPointer<A_Define> def = QMakeShared<A_Define>();

               def->m_name       = dname;
               def->m_definition = definition;
               def->nargs        = count;
               def->isPredefined = true;
               def->nonRecursive = nonRecursive;
               def->fileDef      = s_yyFileDef;
               def->m_fileName   = fileName;

               DefineManager::instance().addDefine(s_yyFileName, def);
            }

         } else if ((posOpen == -1 || posOpen > posEquals)   &&
                    (posClose == -1 || posClose > posEquals) &&
                    ! definedMacro.isEmpty() && definedMacro.length() > posEquals)  {

            // predefined non-function macro definition
            QSharedPointer<A_Define> def = QMakeShared<A_Define>();

            if (posEquals == -1) {
               // simple define without argument
               def->m_name = definedMacro;
               def->m_definition = "1"; // substitute occurrences by 1 (true)

            } else {
               // simple define with argument
               int ine = posEquals - (nonRecursive ? 1 : 0);
               def->m_name = definedMacro.left(ine);
               def->m_definition = definedMacro.right(definedMacro.length() - posEquals - 1);
            }

            if (! def->m_name.isEmpty()) {
               def->nargs = -1;
               def->isPredefined = true;
               def->nonRecursive = nonRecursive;
               def->fileDef      = s_yyFileDef;
               def->m_fileName   = fileName;
               DefineManager::instance().addDefine(s_yyFileName, def);
            }
         }
      }
   }

   s_yyLineNr = 1;
   s_yyColNr  = 1;
   s_ifcount  = 0;

   s_levelGuard.clear();

   BEGIN( Start );

   s_expectGuard = determineSection(fileName) == Entry::HEADER_SEC;
   s_guardName.resize(0);
   s_lastGuardName.resize(0);
   s_guardExpr = "";

   preYYlex();

   s_lexInit = true;

   while (! s_condStack.isEmpty()) {
      QSharedPointer<CondCtx> ctx = s_condStack.pop();
      QString sectionInfo = " ";

      if (ctx->sectionId != " ") {
         sectionInfo = QString(" with label '%1' ").formatArg(QString(ctx->sectionId));
      }

      warn(fileName, ctx->lineNr, "Conditional section %s does not have "
           "a corresponding \\endcond command within this file.", csPrintable(sectionInfo));
   }

   // make sure we do not extend a \cond with missing \endcond over multiple files
   forceEndCondSection();

   DefineManager::instance().endContext();
   printlex(preYY_flex_debug, false, __FILE__, fileName);

   return s_outputString;
}

void preFreeScanner()
{
   if (s_lexInit) {
      preYYlex_destroy();
   }
}

